Spring MVC重复多次读取请求的Body

作者:神秘网友 发布时间:2020-05-18 11:56:31

Spring MVC重复多次读取请求的Body

我们知道,HttpServletRequest的InputStream流只能读取一次,不能重复读取。在Spring MVC中,它提供了类ContentCachingRequestWrapper,它会对原始的HttpServletRequest对象进行包装。 当我们调用request body时,ContentCachingRequestWrapper会把request body的内容进行缓存,这样我们就可以在后续的使用重复读取request body。

创建ContentCachingRequestWrapper

为了使用ContentCachingRequestWrapper,需要我们创建一个web filter,示例如下:

@Component
public class CachingRequestBodyFilter extends GenericFilterBean {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest currentRequest = (HttpServletRequest) servletRequest;
ContentCachingRequestWrapper wrappedRequest = new ContentCachingRequestWrapper(currentRequest);
chain.doFilter(wrappedRequest, servletResponse);
}
}

在Web filter的doFilter方法里,创建ContentCachingRequestWrapper对request做包装。

使用ContentCachingRequestWrapper

接下来我们就可以在Controller里调用ContentCachingRequestWrapper的方法获取request body。示例如下:

@RestController
public class GreetController {
@PostMapping("/greet")
public String greet(@RequestBody String name, HttpServletRequest request) {
ContentCachingRequestWrapper requestWrapper = (ContentCachingRequestWrapper) request;
String requestBody = new String(requestWrapper.getContentAsByteArray());
return "Greetings " + requestBody;
}

这和普通的Controller写法是一样的,只是在获取request body的内容时,调用的是ContentCachingRequestWrapper的getContentAsByteArray方法,它会返回request Body的原始字节。

Spring MVC重复多次读取请求的Body相关教程

  1. springcloud(三):服务提供与调用
  2. 用Spring中的JDBCTemplate操作数据库
  3. Spring BeanPostProcessor 的执行顺序
  4. 第4篇 案例:使用 spring 的 IoC 的实现账户的 CRUD
  5. Dubbo(十一)源码分析(Dubbo 与 Spring 整合、重要接口介绍)
  6. 在IDEA中使用Docker部署SpringBoot项目
  7. Spring Boot 整合 NoSQL(一)
  8. springboot搭建后台框架 (一)整合tkMapper