在filter中读取了前端传来的json数据后会导致控制层没有数据可读,这是因为一般情况下流这种东西只能读取一次,为了解决这种问题,可以使用一些包装类解决
可以使用这两个类ContentCachingRequestWrapper和ContentCachingResponseWrapper
ContentCachingRequestWrapper requestWrapper = new ContentCachingRequestWrapper(new HttpRequestWrapper(request));
ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(execution.execute(requestWrapper, body));
或者在配置文件中配置
server:
servlet:
request:
enable-content-caching: true
response:
enable-content-caching: true
配置文件方式的包装好像很早,可以在任何地方用
此外,这是线程安全的,但是需要注意缓存大小以及缓存过期时间
可以通过设置spring.servlet.request.max-content-length和spring.servlet.response.max-content-length来调整这个限制。
可以通过设置spring.servlet.request.content-cache.time-to-live和spring.servlet.response.content-cache.time-to-live来调整这个时间。
copyBodyToResponse必须在doFilter和ContentCachingResponseWrapper.getContentAsByteArray之后调用,这样才能完整返回数据,取得数据