TRX пре 1 година
родитељ
комит
974cbb6eb9

+ 103 - 0
src/main/java/com/zswl/dataservice/auth/ApiSignRequestWrapper.java

@@ -0,0 +1,103 @@
+package com.zswl.dataservice.auth;
+
+import jakarta.servlet.ReadListener;
+import jakarta.servlet.ServletInputStream;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequestWrapper;
+import org.apache.poi.util.IOUtils;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.logging.Logger;
+
+/**
+ * @author TRX
+ * @date 2024/9/15
+ */
+public class ApiSignRequestWrapper extends HttpServletRequestWrapper {
+
+    //请求体
+    private String requestBody;
+
+    //io流
+    private BufferedReader reader;
+
+    //io流
+    private ServletInputStream inputStream;
+
+    //日志
+    private Logger log = Logger.getLogger("ApiSignRequestWrapper");
+
+    public ApiSignRequestWrapper(HttpServletRequest request) throws IOException {
+        super(request);
+        setCharacterEncoding(request.getCharacterEncoding());
+        //读取请求体
+        requestBody = new String(IOUtils.toByteArray(request.getInputStream()), request.getCharacterEncoding());
+    }
+
+    /**
+     * 获取内容
+     */
+    public String getRequestBody() {
+        return requestBody;
+    }
+
+    /**
+     * 改变内容
+     */
+    public void setRequestBody(String requestBody) {
+        this.requestBody = requestBody;
+    }
+
+    @Override
+    public ServletInputStream getInputStream() throws IOException {
+        if (inputStream == null) {
+            inputStream = new RequestCachingInputStream(requestBody.getBytes(getCharacterEncoding()));
+        }
+        return inputStream;
+    }
+
+    @Override
+    public BufferedReader getReader() throws IOException {
+        if (reader == null) {
+            reader = new BufferedReader(new InputStreamReader(getInputStream(), getCharacterEncoding()));
+        }
+        return reader;
+    }
+
+    /**
+     * 缓存输入流
+     **/
+    private class RequestCachingInputStream extends ServletInputStream {
+
+        private ByteArrayInputStream inputStream;
+
+        public RequestCachingInputStream(byte[] bytes) {
+            inputStream = new ByteArrayInputStream(bytes);
+        }
+
+        @Override
+        public int read() throws IOException {
+            return inputStream.read();
+        }
+
+        @Override
+        public boolean isFinished() {
+            return inputStream.available() == 0;
+        }
+
+        @Override
+        public boolean isReady() {
+            return true;
+        }
+
+        @Override
+        public void setReadListener(ReadListener readListener) {
+
+        }
+
+    }
+
+}

+ 21 - 18
src/main/java/com/zswl/dataservice/auth/RequestCachingFilter.java

@@ -24,24 +24,27 @@ public class RequestCachingFilter extends OncePerRequestFilter {
 
     @Override
     protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
-        ContentCachingRequestWrapper wrappedRequest = new ContentCachingRequestWrapper(httpServletRequest);
-        try {
-            int contentLenth = wrappedRequest.getContentLength();
-            byte[] bytes = new byte[contentLenth];
-            ServletInputStream is = wrappedRequest.getInputStream();
-            for (int index = 0; index < contentLenth; index++) {
-                int value = is.read();
-                if (value == -1) {
-                    is.reset();
-                    break;
-                }
-                bytes[index] = (byte) value;
-            }
-            bytes = null;
-            is = null;
-        } catch (Exception e) {
-            log.error("RequestCachingFilter error: {}", e.getMessage());
-        }
+//        ContentCachingRequestWrapper wrappedRequest = new ContentCachingRequestWrapper(httpServletRequest);
+//        try {
+//            int contentLenth = wrappedRequest.getContentLength();
+//            byte[] bytes = new byte[contentLenth];
+//            ServletInputStream is = wrappedRequest.getInputStream();
+//            for (int index = 0; index < contentLenth; index++) {
+//                int value = is.read();
+//                if (value == -1) {
+//                    is.reset();
+//                    break;
+//                }
+//                bytes[index] = (byte) value;
+//            }
+//            bytes = null;
+//            is = null;
+//        } catch (Exception e) {
+//            log.error("RequestCachingFilter error: {}", e.getMessage());
+//        }
+
+        ApiSignRequestWrapper wrappedRequest = new ApiSignRequestWrapper(httpServletRequest);
+        wrappedRequest.getRequestBody();
         ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(httpServletResponse);
         filterChain.doFilter(wrappedRequest, responseWrapper);
     }

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

@@ -1,25 +1,20 @@
 package com.zswl.dataservice.controller.openApi;
 
-import com.github.microservice.models.hxz.ServerTimeModel;
-import com.github.microservice.models.hxz.ServerTimeResult;
 import com.zswl.dataservice.model.openApi.SystemTimeModel;
 import com.zswl.dataservice.model.openApi.SystemTimeParam;
-import com.zswl.dataservice.service.openApi.SystemTimeService;
+import com.zswl.dataservice.service.openApi.business.SystemTimeService;
 import com.zswl.dataservice.utils.HttpUtils;
 import com.zswl.dataservice.utils.result.ResultContent;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
-import jakarta.servlet.ServletInputStream;
 import jakarta.servlet.http.HttpServletRequest;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpRequest;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.util.ContentCachingRequestWrapper;
 
 /**
  * 系统时间服务
@@ -38,8 +33,8 @@ public class SystemTimeController {
 
     @Operation(summary = "获取服务器时间接口")
     @PostMapping(value = "serverTime", consumes = MediaType.APPLICATION_JSON_VALUE)
-    public ResultContent<SystemTimeModel> serverTime(HttpServletRequest request) {
-        SystemTimeParam param = HttpUtils.toBean(request, SystemTimeParam.class);
+    public ResultContent<SystemTimeModel> serverTime(HttpServletRequest request,@RequestBody SystemTimeParam param) {
+//        SystemTimeParam param = HttpUtils.toBean(request, SystemTimeParam.class);
 
         return systemTimeService.serverTime(param);
     }

+ 5 - 3
src/main/java/com/zswl/dataservice/service/openApi/OpenApiVerifyService.java

@@ -2,6 +2,7 @@ package com.zswl.dataservice.service.openApi;
 
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
+import com.zswl.dataservice.auth.ApiSignRequestWrapper;
 import com.zswl.dataservice.auth.OpenAPIContext;
 import com.zswl.dataservice.dao.openApi.BlackListDao;
 import com.zswl.dataservice.dao.openApi.OpenApiRequestLogDao;
@@ -21,6 +22,7 @@ import com.zswl.dataservice.utils.net.IPUtil;
 import com.zswl.dataservice.utils.os.SystemUtil;
 import com.zswl.dataservice.utils.result.ResultContent;
 import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequestWrapper;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
@@ -98,10 +100,10 @@ public class OpenApiVerifyService {
         if (!openVerify) {
             return true;
         }
-        if (request instanceof ContentCachingRequestWrapper) {
-            ContentCachingRequestWrapper contentCachingRequestWrapper = (ContentCachingRequestWrapper) request;
+        if (request instanceof ApiSignRequestWrapper) {
+            ApiSignRequestWrapper contentCachingRequestWrapper = (ApiSignRequestWrapper) request;
             ContentCachingResponseWrapper responseWrapper = (ContentCachingResponseWrapper) response;
-            String requestStr = contentCachingRequestWrapper.getContentAsString();
+            String requestStr = contentCachingRequestWrapper.getRequestBody();
 
             String msg = "认证错误";
             int code = 403;