CustomHttpServletRequestWrapper.java
:包装请求,缓存请求体数据,重写读取数据方法
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;public class CustomHttpServletRequestWrapper extends HttpServletRequestWrapper {/*** 缓存请求体数据*/private byte[] requestBody;public CustomHttpServletRequestWrapper(HttpServletRequest request) throws IOException {super(request);// 读取请求体并缓存requestBody = request.getInputStream().readAllBytes();}@Overridepublic ServletInputStream getInputStream() throws IOException {// 返回缓存的请求体字节流ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(requestBody);return new ServletInputStream() {@Overridepublic int read() throws IOException {return byteArrayInputStream.read();}@Overridepublic boolean isFinished() {return byteArrayInputStream.available() == 0;}@Overridepublic boolean isReady() {return true;}@Overridepublic void setReadListener(ReadListener readListener) {}};}@Overridepublic BufferedReader getReader() throws IOException {return new BufferedReader(new InputStreamReader(this.getInputStream()));}public byte[] getRequestBody() {return this.requestBody;}
}
RequestBodyCachingFilter
:包装POST请求
import cn.hutool.extra.servlet.ServletUtil;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;@Component
// 确保过滤器优先执行
@Order(1)
public class RequestBodyCachingFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {HttpServletRequest httpServletRequest = (HttpServletRequest) request;if (ServletUtil.METHOD_POST.equalsIgnoreCase(httpServletRequest.getMethod())) {// 包装 HttpServletRequestCustomHttpServletRequestWrapper wrappedRequest = new CustomHttpServletRequestWrapper(httpServletRequest);// 继续过滤链,传递包装后的请求对象chain.doFilter(wrappedRequest, response);} else {chain.doFilter(request, response);}}
}
CustomInterceptor.java
:拦截器中取POST请求体的数据
import cn.hutool.extra.servlet.ServletUtil;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;public class CustomInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {if (ServletUtil.METHOD_POST.equalsIgnoreCase(request.getMethod()) && request instanceof CustomHttpServletRequestWrapper) {CustomHttpServletRequestWrapper wrappedRequest = (CustomHttpServletRequestWrapper) request;String requestBody = getRequestBody(wrappedRequest);System.out.println("请求体内容为 >>> " + requestBody);}return true;}private String getRequestBody(CustomHttpServletRequestWrapper request) throws UnsupportedEncodingException {byte[] buf = request.getRequestBody();if (buf.length > 0) {return new String(buf, 0, buf.length, request.getCharacterEncoding());}return null;}
}
WebConfig
:配置拦截器生效
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new CustomInterceptor());}
}