TRX 1 year ago
parent
commit
437ee99690

+ 11 - 0
src/main/java/com/zswl/dataservice/auth/OpenAPIContext.java

@@ -6,6 +6,8 @@ public class OpenAPIContext {
 
     public static ThreadLocal<String> context = new ThreadLocal<String>();
 
+    public static ThreadLocal<Long> timeContext = new ThreadLocal<Long>();
+
     public static String get() {
         return context.get();
     }
@@ -14,7 +16,16 @@ public class OpenAPIContext {
         context.set(param);
     }
 
+    public static Long getTime() {
+        return timeContext.get();
+    }
+
+    public static void setTime(Long param) {
+        timeContext.set(param);
+    }
+
     public static void clear() {
         context.remove();
+        timeContext.remove();
     }
 }

+ 1 - 0
src/main/java/com/zswl/dataservice/auth/OpenAPIInterceptor.java

@@ -77,5 +77,6 @@ public class OpenAPIInterceptor implements HandlerInterceptor {
     @Override
     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
         log.info("afterCompletion");
+        OpenAPIContext.clear();
     }
 }

+ 3 - 1
src/main/java/com/zswl/dataservice/auth/RequestCachingFilter.java

@@ -11,6 +11,7 @@ import org.springframework.boot.web.servlet.ServletComponentScan;
 import org.springframework.stereotype.Component;
 import org.springframework.web.filter.OncePerRequestFilter;
 import org.springframework.web.util.ContentCachingRequestWrapper;
+import org.springframework.web.util.ContentCachingResponseWrapper;
 
 import java.io.IOException;
 
@@ -41,6 +42,7 @@ public class RequestCachingFilter extends OncePerRequestFilter {
         } catch (Exception e) {
             log.error("RequestCachingFilter error: {}", e.getMessage());
         }
-        filterChain.doFilter(wrappedRequest, httpServletResponse);
+        ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(httpServletResponse);
+        filterChain.doFilter(wrappedRequest, responseWrapper);
     }
 }

+ 2 - 2
src/main/java/com/zswl/dataservice/controller/openApi/SystemTimeController.java

@@ -44,8 +44,8 @@ public class SystemTimeController {
             log.info("--------------{}", wrapper.getContentAsString());
         }
 
-//        return systemTimeService.serverTime(param);
-        return ResultContent.buildFail("拒绝请求", 402);
+        return systemTimeService.serverTime(param);
+//        return ResultContent.buildFail("拒绝请求", 402);
     }
 
 }

+ 12 - 0
src/main/java/com/zswl/dataservice/dataConfig/OpenAPIConfig.java

@@ -0,0 +1,12 @@
+package com.zswl.dataservice.dataConfig;
+
+/**
+ * @author TRX
+ * @date 2024/9/14
+ */
+public class OpenAPIConfig {
+
+    // openAPI日志保存时间
+    public static final Long logTTL = 90 * 24 * 60 * 60 * 1000L;
+
+}

+ 12 - 0
src/main/java/com/zswl/dataservice/domain/openApi/OpenApiRequestLog.java

@@ -34,9 +34,21 @@ public class OpenApiRequestLog extends SuperEntity {
     @Schema(description = "请求参数")
     private Object requestBody;
 
+    @Schema(description = "认证信息")
+    private String authorization;
+
     @Schema(description = "响应参数")
     private Object responseBody;
 
+    @Schema(description = "响应是否成功")
+    private Boolean isSuccess = Boolean.FALSE;
+
+    @Schema(description = "原因")
+    private String errorMsg;
+
+    @Schema(description = "响应时间")
+    private Long responseTime;
+
     @Schema(description = "IP地址")
     private String ip;
 

+ 59 - 7
src/main/java/com/zswl/dataservice/service/openApi/OpenApiVerifyService.java

@@ -1,17 +1,28 @@
 package com.zswl.dataservice.service.openApi;
 
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.zswl.dataservice.auth.OpenAPIContext;
 import com.zswl.dataservice.dao.openApi.BlackListDao;
 import com.zswl.dataservice.dao.openApi.OpenApiRequestLogDao;
+import com.zswl.dataservice.dataConfig.OpenAPIConfig;
+import com.zswl.dataservice.domain.openApi.OpenApiRequestLog;
 import com.zswl.dataservice.service.base.RedisService;
 import com.zswl.dataservice.service.user.OperationLogsService;
 import com.zswl.dataservice.type.OperationLogType;
+import com.zswl.dataservice.utils.DateUtils;
+import com.zswl.dataservice.utils.HttpUtils;
 import com.zswl.dataservice.utils.mqtt.type.LogsLevel;
 import com.zswl.dataservice.utils.net.IPUtil;
 import com.zswl.dataservice.utils.os.SystemUtil;
+import com.zswl.dataservice.utils.result.ResultContent;
+import jakarta.servlet.ServletInputStream;
+import jakarta.servlet.ServletOutputStream;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
+import org.aspectj.apache.bcel.classfile.Module;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationContext;
 import org.springframework.stereotype.Service;
@@ -19,7 +30,12 @@ import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.util.ContentCachingRequestWrapper;
+import org.springframework.web.util.ContentCachingResponseWrapper;
 
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.util.Date;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
@@ -68,13 +84,14 @@ public class OpenApiVerifyService {
     @SneakyThrows
     public boolean verify(HttpServletRequest request, HttpServletResponse response, Object object) {
         log.info("---------------------openAPI验证----------------------");
-        String method = request.getMethod();
-        String sessionId = request.getRequestedSessionId();
-        log.info("sessionId: {}", sessionId);
-        String remoteIp = IPUtil.getRemoteIp(request);
+        OpenAPIContext.setTime(System.currentTimeMillis());
         if (request instanceof ContentCachingRequestWrapper) {
             ContentCachingRequestWrapper contentCachingRequestWrapper = (ContentCachingRequestWrapper) request;
-            log.info("body {}", contentCachingRequestWrapper.getContentAsString());
+            String requestStr = contentCachingRequestWrapper.getContentAsString();
+            log.info("body {}", requestStr);
+            String authorization = request.getHeader("authorization");
+
+
         }
         return true;
     }
@@ -87,8 +104,43 @@ public class OpenApiVerifyService {
      * @param handler
      * @param modelAndView
      */
-    public void saveLog(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
-        log.info("saveLog");
+    @SneakyThrows
+    public void saveLog(HttpServletRequest request, HttpServletResponse response,
+            Object handler, ModelAndView modelAndView) {
+        OpenApiRequestLog openApiRequestLog = new OpenApiRequestLog();
+        JSONObject param = HttpUtils.getRequestObj(request);
+        if (param != null) {
+            openApiRequestLog.setRequestBody(param);
+            openApiRequestLog.setAppId(param.getStr("appId"));
+        }
+        Long startTime = OpenAPIContext.getTime();
+        openApiRequestLog.setResponseTime(System.currentTimeMillis());
+        if (startTime != null) {
+            openApiRequestLog.setRequestTime(startTime);
+            openApiRequestLog.setRequestTimeStr(DateUtils.paresTime(startTime, DateUtils.FORMAT_LONG));
+            openApiRequestLog.setUserTime(System.currentTimeMillis() - startTime);
+        }
+        try {
+            openApiRequestLog.setUa(request.getHeader("User-Agent"));
+            openApiRequestLog.setIp(IPUtil.getRemoteIp(request));
+            openApiRequestLog.setUrl(request.getRequestURI());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        openApiRequestLog.setAuthorization(request.getHeader("authorization"));
+        openApiRequestLog.setTTL(new Date(System.currentTimeMillis() + OpenAPIConfig.logTTL));
+        if (response instanceof ContentCachingResponseWrapper) {
+            ContentCachingResponseWrapper responseWrapper = (ContentCachingResponseWrapper) response;
+            byte[] bytes = responseWrapper.getContentAsByteArray();
+            ResultContent resultContent = HttpUtils.toBean(new String(bytes), ResultContent.class);
+            if (resultContent != null) {
+                openApiRequestLog.setIsSuccess(resultContent.isSuccess());
+                openApiRequestLog.setErrorMsg(resultContent.getMsg());
+            }
+            openApiRequestLog.setResponseBody(resultContent);
+            responseWrapper.copyBodyToResponse();
+        }
+        openApiRequestLogDao.save(openApiRequestLog);
     }
 
     public boolean isInBlackList(HttpServletRequest request) {

+ 47 - 0
src/main/java/com/zswl/dataservice/utils/HttpUtils.java

@@ -0,0 +1,47 @@
+package com.zswl.dataservice.utils;
+
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.SneakyThrows;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.formula.functions.T;
+import org.springframework.web.util.ContentCachingRequestWrapper;
+
+/**
+ * @author TRX
+ * @date 2024/9/14
+ */
+public class HttpUtils {
+
+    @SneakyThrows
+    public static String getRequestParam(HttpServletRequest request) {
+        String jsonStr = "";
+        if (request instanceof ContentCachingRequestWrapper) {
+            ContentCachingRequestWrapper contentCachingRequestWrapper = (ContentCachingRequestWrapper) request;
+            jsonStr = contentCachingRequestWrapper.getContentAsString();
+        }
+        return jsonStr;
+    }
+
+    public static JSONObject getRequestObj(HttpServletRequest request) {
+        String jsonStr = getRequestParam(request);
+        JSONObject jsonObject = null;
+        if (StringUtils.isNotEmpty(jsonStr) && jsonStr.indexOf("{") >= 0) {
+            try {
+                jsonObject = JSONUtil.parseObj(jsonStr);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return jsonObject;
+    }
+
+    public static <T> T toBean(String jsonStr, Class<T> clazz) {
+        if (StringUtils.isNotEmpty(jsonStr) && jsonStr.indexOf("{") >= 0) {
+            return JSONUtil.toBean(jsonStr, clazz);
+        }
+        return null;
+    }
+
+}