- jakarta.servlet.http.HttpServletRequestWrapper
此类是HttpServletRequest的子类,提供了HttpServletRequest接口的边界实现,开发人员可以根据自己的需要实现此包装类的具体方法。
- org.springframework.web.util.ContentCachingRequestWrapper
ContentCachingRequestWrapper是spring对HttpServletRequest的实现,用于解决请求内容不可以重复读取问题;其用于缓存所有从input stream和reader读取的内容,并且允许这些内容通过字节数组存储;此类扮演了拦截器的角色来缓存请求内容,如果请求内容没有被消费,则请求内容将不会被缓存,并且通过getContentAsByteArray()获取不到请求内容;
java
@Component
public class RequestWrapperFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
//创建ContentCachingRequestWrapper对象用于缓存请求体
ContentCachingRequestWrapper requestWrapper = new ContentCachingRequestWrapper(request);
//创建ContentCachingResponseWrapper对象用于缓存响应体
ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(response);
//继续执行过滤器链,并传递包装后的请求对象
filterChain.doFilter(requestWrapper, responseWrapper);
//过滤器链执行完毕,请求体被消费 读取缓存的请求体
byte[] reqBody = requestWrapper.getContentAsByteArray();
//将请求体转换为字符串
String reqBodyStr = new String(reqBody, requestWrapper.getCharacterEncoding());
//打印请求体
System.out.println("Request Param:" + reqBodyStr);
//----------------response----------------
//过滤器执行完毕,读取响应体
byte[] resBody = responseWrapper.getContentAsByteArray();
//将响应体转换为字符串
String resBodyStr = new String(resBody, responseWrapper.getCharacterEncoding());
//打印响应体信息
System.out.println("Response Body:" + resBodyStr);
//将缓存的响应体数据回写到响应流中
responseWrapper.copyBodyToResponse();
}
}
ContentCachingResponseWrapper是读响应数据进行缓存