【发布时间】:2018-02-03 09:28:43
【问题描述】:
我有一个 Spring Boot 应用程序。现在我需要在拦截器中读取请求和响应。我使用HttpServletRequestWrapper 替换DispatcherServlet 中的请求
@Component("dispatcherServlet")
public class FofDisPatcherServlet extends DispatcherServlet {
@Override
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
MultiReadHttpServletRequest requestWrapper = null;
try {
requestWrapper = new MultiReadHttpServletRequest(request);
super.doDispatch(requestWrapper, response);
} catch (Exception e) {
super.doDispatch(request,response);
}
}
}
在我的拦截器中,我可以读取请求正文。但是当我想读取响应正文时,它不起作用。当我替换 CustomerDispatcherServlet 中的响应时,我没有得到任何响应。我尝试过 ContentCachingResponseWrapper ,但我得到了带有“”的有效负载。
这是一个老问题。我已经搜索了一些问题,但没有找到合适的解决方案。
我知道我可以用AOP 解决问题。但是我想知道如何在拦截器中解决问题?
这是我的拦截器代码
public class CustomerInterceptor extends HandlerInterceptorAdapter{
@Override
public void postHandle(...){
MultiReadHttpServletRequest req = (MultiReadHttpServletRequest) request;
ContentCachingResponseWrapper res = new ContentCachingResponseWrapper(response);
Byte[] body = res. getContentAsByteArray();
...
}
}
我得到的身体是[]。
【问题讨论】:
-
你能分享更多你的代码吗?您是如何使用
ContentCachingResponseWrapper的?正如 javadoc 所说,您应该在其上调用getContentAsByteArray()方法来检索内容 -
是的,我使用
getContentAsByteArray(),但我对“”感到满意。 -
能否分享拦截器代码,问题出在拦截器部分。
-
您应该将响应对象包装在 servlet 过滤器中,而不是在拦截器中。
-
@Leffchik 但是为什么它在拦截器中不起作用。我在文档中没有找到它。
标签: spring spring-mvc spring-boot