Sfoglia il codice sorgente

重复读取 Request Body 内容

zouxuan 1 anno fa
parent
commit
21ebacf1ab

+ 69 - 0
mec-application/src/main/java/com/ym/mec/config/RequestWrapper.java

@@ -0,0 +1,69 @@
+package com.ym.mec.config;
+
+import org.apache.commons.io.IOUtils;
+
+import javax.servlet.ReadListener;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import java.io.*;
+
+public class RequestWrapper extends HttpServletRequestWrapper {
+
+    //参数字节数组
+    private byte[] requestBody;
+
+    //Http请求对象
+    private HttpServletRequest request;
+
+    public RequestWrapper(HttpServletRequest request) throws IOException {
+        super(request);
+        this.request = request;
+    }
+
+    @Override
+    public ServletInputStream getInputStream() throws IOException {
+        /**
+         * 每次调用此方法时将数据流中的数据读取出来,然后再回填到InputStream之中
+         * 解决通过@RequestBody和@RequestParam(POST方式)读取一次后控制器拿不到参数问题
+         */
+        if (null == this.requestBody) {
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            IOUtils.copy(request.getInputStream(), baos);
+            this.requestBody = baos.toByteArray();
+        }
+
+        final ByteArrayInputStream bais = new ByteArrayInputStream(requestBody);
+        return new ServletInputStream() {
+
+            @Override
+            public boolean isFinished() {
+                return false;
+            }
+
+            @Override
+            public boolean isReady() {
+                return false;
+            }
+
+            @Override
+            public void setReadListener(ReadListener listener) {
+
+            }
+
+            @Override
+            public int read() {
+                return bais.read();
+            }
+        };
+    }
+
+    public byte[] getRequestBody() {
+        return requestBody;
+    }
+
+    @Override
+    public BufferedReader getReader() throws IOException {
+        return new BufferedReader(new InputStreamReader(this.getInputStream()));
+    }
+}

+ 14 - 0
mec-application/src/main/java/com/ym/mec/config/WebMvcConfig.java

@@ -14,10 +14,12 @@ import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
 import com.ym.mec.common.config.EnumConverterFactory;
 import com.ym.mec.common.config.LocalFastJsonHttpMessageConverter;
 import com.ym.mec.common.enums.BaseEnum;
+import com.ym.mec.filter.RequestBodyReaderFilter;
 import com.ym.mec.interceptor.OperationLogInterceptor;
 import com.ym.mec.interceptor.TenantInterceptor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Primary;
@@ -128,4 +130,16 @@ public class WebMvcConfig implements WebMvcConfigurer {
 		return new HttpMessageConverters(converter);
 	}
 
+	@Bean
+	public FilterRegistrationBean<RequestBodyReaderFilter> fequestBodyReaderFilter() {
+		FilterRegistrationBean<RequestBodyReaderFilter> registrationBean = new FilterRegistrationBean<>();
+		RequestBodyReaderFilter filter = new RequestBodyReaderFilter();
+		registrationBean.setFilter(filter);
+		ArrayList<String> urls = new ArrayList<>();
+		urls.add("/*");//配置过滤规则
+		registrationBean.setUrlPatterns(urls);
+		registrationBean.setOrder(3);
+		return registrationBean;
+	}
+
 }

+ 39 - 0
mec-application/src/main/java/com/ym/mec/filter/RequestBodyReaderFilter.java

@@ -0,0 +1,39 @@
+package com.ym.mec.filter;
+
+import com.ym.mec.config.RequestWrapper;
+
+import javax.servlet.*;
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+
+public class RequestBodyReaderFilter implements Filter {
+
+    @Override
+    public void init(FilterConfig filterConfig) throws ServletException {
+
+    }
+
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
+        try {
+            ServletRequest requestWrapper = null;
+            if (request instanceof HttpServletRequest) {
+                requestWrapper = new RequestWrapper((HttpServletRequest) request);
+            }
+            if (requestWrapper == null) {
+                chain.doFilter(request, response);
+            } else {
+                chain.doFilter(requestWrapper, response);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (ServletException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public void destroy() {
+
+    }
+}