소스 검색

feat: 添加请求日志拦截打印

weijianghai 11 달 전
부모
커밋
97b045d854

+ 4 - 4
pom.xml

@@ -3,10 +3,10 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.example</groupId>
-    <artifactId>gdc-finance-api</artifactId>
+    <artifactId>finance-gdc-api</artifactId>
     <version>0.0.1-SNAPSHOT</version>
-    <name>gdc-finance-api</name>
-    <description>gdc-finance-api</description>
+    <name>finance-gdc-api</name>
+    <description>finance-gdc-api</description>
     <properties>
         <java.version>17</java.version>
         <maven.compiler.source>${java.version}</maven.compiler.source>
@@ -148,7 +148,7 @@
     </dependencyManagement>
 
     <build>
-        <finalName>gdc-finance-api</finalName>
+        <finalName>finance-gdc-api</finalName>
         <plugins>
             <plugin>
                 <groupId>org.springframework.boot</groupId>

+ 1 - 1
readme.md

@@ -5,4 +5,4 @@
 
 ### 后端
 
-133.96.95.30/app/gdc-finance-api
+133.96.95.30/app/finance-gdc-api

+ 2 - 2
scripts/rollback.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 
 sh stop.sh
-rm -rf gdc-finance-api.jar
-mv gdc-finance-api.jar.bak gdc-finance-api.jar
+rm -rf finance-gdc-api.jar
+mv finance-gdc-api.jar.bak finance-gdc-api.jar
 sh run.sh

+ 1 - 1
scripts/run.sh

@@ -1,3 +1,3 @@
 #!/bin/bash
 
-nohup /app/jdks/jdk17/bin/java -Dspring.profiles.active=prod -jar gdc-finance-api.jar >/dev/null 2>&1 &
+nohup /app/jdks/jdk17/bin/java -Dspring.profiles.active=prod -jar finance-gdc-api.jar >/dev/null 2>&1 &

+ 1 - 1
scripts/stop.sh

@@ -1,5 +1,5 @@
 #!/bin/bash
 
-for i in $(pgrep -f gdc-finance-api.jar); do
+for i in $(pgrep -f finance-gdc-api.jar); do
   kill -9 "$i"
 done

+ 3 - 3
scripts/update.sh

@@ -1,7 +1,7 @@
 #!/bin/bash
 
-rm -rf gdc-finance-api.jar.bak
+rm -rf finance-gdc-api.jar.bak
 sh stop.sh
-mv gdc-finance-api.jar gdc-finance-api.jar.bak
-mv gdc-finance-api.jar.new gdc-finance-api.jar
+mv finance-gdc-api.jar finance-gdc-api.jar.bak
+mv finance-gdc-api.jar.new finance-gdc-api.jar
 sh run.sh

+ 47 - 0
src/main/java/com/example/config/web/MyDispatcherServlet.java

@@ -0,0 +1,47 @@
+package com.example.config.web;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.servlet.DispatcherServlet;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+@Slf4j
+public class MyDispatcherServlet extends DispatcherServlet {
+    /**
+     * 上传和返回文件流的接口uri,不替换request和response
+     */
+    public static final Set<String> UN_WRAPPER = Stream.of(
+            "/house-car/house/dist/api/data-import/dataImport",
+            "/house-car/house/dist/api/WzBuildManageDetails/ideListExport",
+            "/house-car/house/dist/api/wzHouseMaintenaCost/queryHighPriceExport",
+            "/house-car/house/dist/api/wzHouseMaintenaCost/queryHighFrequencyExport",
+            "/house-car/house/dist/api/WzBuildManageDetails/excel",
+            "/house-car/house/dist/api/WzHouseContractOut/excel",
+            "/house-car/house/dist/api/WzHouseContrac/excel",
+            "/house-car/house/dist/api/WzHouseLeaseInCon/excel",
+            "/house-car/house/dist/api/wzHouseMaintenaCost/excel",
+            "/house-car/house/dist/api/WzHouseUse/excel",
+            "/house-car/house/dist/api/WzLandManageDetails/excel",
+            "/house-car/house/dist/api/wzLowestUnitPrice/excel",
+            "/house-car/house/dist/api/wzRentHouseArrears/excel",
+            "/house-car/house/dist/api/wzRentThreeMonth/excel",
+            "/house-car/house/dist/api/wzScoreRanking/excel",
+            "/house-car/house/dist/api/WzBuildManageDetails/loadWord"
+    ).collect(Collectors.toSet());
+
+    @Override
+    protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
+        String uri = request.getRequestURI();
+        if (UN_WRAPPER.contains(request.getRequestURI())) {
+            super.doDispatch(request, response);
+        } else {
+            // 替换request和response
+            log.info("替换 {} 的request和response", uri);
+            super.doDispatch(new MyHttpServletRequestWrapper(request), new MyHttpServletResponseWrapper(response));
+        }
+    }
+}

+ 58 - 0
src/main/java/com/example/config/web/MyHttpServletRequestWrapper.java

@@ -0,0 +1,58 @@
+package com.example.config.web;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.util.StreamUtils;
+
+import javax.servlet.ReadListener;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+
+/**
+ * 解决流只能读取一次问题
+ */
+@Slf4j
+public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper {
+    private byte[] bytes;
+
+    public MyHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
+        super(request);
+        bytes = StreamUtils.copyToByteArray(request.getInputStream());
+    }
+
+    @Override
+    public ServletInputStream getInputStream() {
+        ByteArrayInputStream stream = new ByteArrayInputStream(bytes);
+        return new ServletInputStream() {
+            @Override
+            public boolean isFinished() {
+                return false;
+            }
+
+            @Override
+            public boolean isReady() {
+                return false;
+            }
+
+            @Override
+            public void setReadListener(ReadListener readListener) {
+                //
+            }
+
+            @Override
+            public int read() {
+                return stream.read();
+            }
+        };
+    }
+
+    @Override
+    public BufferedReader getReader() throws UnsupportedEncodingException {
+        return new BufferedReader(new InputStreamReader(getInputStream(), super.getCharacterEncoding()));
+    }
+}

+ 47 - 0
src/main/java/com/example/config/web/MyHttpServletResponseWrapper.java

@@ -0,0 +1,47 @@
+package com.example.config.web;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.WriteListener;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpServletResponseWrapper;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+/**
+ * 解决流只能读取一次问题
+ */
+public class MyHttpServletResponseWrapper extends HttpServletResponseWrapper {
+    private ByteArrayOutputStream byteArrayOutputStream;
+    private ServletOutputStream servletOutputStream;
+
+    public MyHttpServletResponseWrapper(HttpServletResponse response) {
+        super(response);
+        byteArrayOutputStream = new ByteArrayOutputStream();
+        servletOutputStream = new ServletOutputStream() {
+            @Override
+            public boolean isReady() {
+                return false;
+            }
+
+            @Override
+            public void setWriteListener(WriteListener writeListener) {
+                //
+            }
+
+            @Override
+            public void write(int b) throws IOException {
+                response.getOutputStream().write(b);
+                byteArrayOutputStream.write(b);
+            }
+        };
+    }
+
+    @Override
+    public ServletOutputStream getOutputStream() {
+        return servletOutputStream;
+    }
+
+    public byte[] toByteArray() {
+        return byteArrayOutputStream.toByteArray();
+    }
+}

+ 13 - 0
src/main/java/com/example/config/web/MyWebMvcConfigurer.java

@@ -1,6 +1,10 @@
 package com.example.config.web;
 
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.DispatcherServlet;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
@@ -15,6 +19,15 @@ public class MyWebMvcConfigurer implements WebMvcConfigurer {
 //        registry.addInterceptor(new TokenInterceptor()).addPathPatterns("/house-car/**");
     }
 
+    /**
+     * 使用自定义DispatcherServlet
+     */
+    @Bean
+    @Qualifier(DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
+    public DispatcherServlet dispatcherServlet() {
+        return new MyDispatcherServlet();
+    }
+
 //    /**
 //     * 配置消息转换器
 //     *

+ 17 - 4
src/main/java/com/example/config/web/RequestLogHandlerInterceptor.java

@@ -9,6 +9,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.slf4j.MDC;
 import org.springframework.lang.Nullable;
 import org.springframework.util.StopWatch;
+import org.springframework.util.StreamUtils;
 import org.springframework.util.StringUtils;
 import org.springframework.web.servlet.HandlerInterceptor;
 
@@ -16,6 +17,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.net.URLDecoder;
+import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 import java.time.LocalDateTime;
 import java.util.Enumeration;
@@ -61,13 +63,21 @@ public class RequestLogHandlerInterceptor implements HandlerInterceptor {
             parameters.put(k, v);
         }
         log.info("查询参数: {}", new ObjectMapper().writeValueAsString(parameters));
+        String body = null;
+        if (!MyDispatcherServlet.UN_WRAPPER.contains(request.getRequestURI())) {
+            // 请求体参数
+            body = StreamUtils.copyToString(request.getInputStream(), Charset.forName(request.getCharacterEncoding()));
+            log.info("请求体参数: {}", StringUtils.trimAllWhitespace(body));
+        }
         // todo: 记录日志
         String token = request.getHeader("token");
+        if (!StringUtils.hasText(token) || "undefined".equals(token)) {
+            token = parameters.get("token");
+        }
         log.info("token: {}", token);
-        if (!StringUtils.hasText(token)) {
+//        if (!StringUtils.hasText(token)) {
 //            return forbidden(response);
-            return true;
-        }
+//        }
         try {
             String urlDecodeToken = URLDecoder.decode(token, StandardCharsets.UTF_8);
             log.info("urlDecodeToken: {}", urlDecodeToken);
@@ -80,8 +90,11 @@ public class RequestLogHandlerInterceptor implements HandlerInterceptor {
 //                return forbidden(response);
 //            }
             map.put("api", request.getRequestURI());
-//            map.put("body", body);
+            map.put("body", body);
             map.put("time", now.toString());
+            map.put("headers", gson.toJson(headers));
+            map.put("parameters", gson.toJson(parameters));
+            map.put("token", urlDecodeToken);
             log.info("调用记录: {}", gson.toJson(map));
         } catch (Exception e) {
             log.warn("token解密失败: {}", token);

+ 2 - 2
src/main/resources/application-prod.yml

@@ -2,9 +2,9 @@ server:
   port: 39101
 spring:
   datasource:
+    driver-class-name: org.postgresql.Driver
     username: finance
     password: Finance@unicom23
-    driver-class-name: org.postgresql.Driver
     url: jdbc:postgresql://172.16.107.5:5432/financialdb
 springdoc:
   api-docs:
@@ -16,4 +16,4 @@ knife4j:
 logging:
   level:
     com:
-      nokia: info
+      nokia: info