我想要做的是,在处理请求后为响应添加新标头.我需要检查已处理的HttpStatus代码(在我的情况下401未经授权)并添加新的标头.我知道Spring有拦截器,但无法按照文档中的说明修改响应:
请注意,HandlerInterceptor的postHandle方法并不总是非常适合与@ResponseBody和ResponseEntity方法一起使用.在这种情况下,HttpMessageConverter在调用postHandle之前写入并提交响应,这使得无法更改响应,例如添加标头.相反,应用程序可以实现ResponseBodyAdvice并将其声明为@ControllerAdvice bean或直接在RequestMappingHandlerAdapter上配置它.
好吧,我实施了ResponseBodyAdvice.是的,它允许修改身体,但我无法修改标头,事件无法找到从控制器返回的状态代码.
使用servlet过滤器的另一个选择也不成功.我需要在filterChain.doFilter(servletRequest, servletResponse);通话后添加标题.但它再次不会修改标头值.有没有办法完成这个简单的任务?
我已经搜索并看到了有关此问题的几个帖子,但没有找到答案如何可能。
我想要做的是在过滤器链之后添加标头,
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletResponse httpResp = (HttpServletResponse) response;
try {
HttpServletResponseWrapper bufferedResponse = new HttpServletResponseWrapper (httpResp);
chain.doFilter(request, bufferedResponse);
} finally {
// header added at this line is not actually being added.
bufferedResponse.setHeader("ADD A HEADER: ", "HEADER");
}
}
Run Code Online (Sandbox Code Playgroud)
多个帖子都在谈论使用 HttpServletResponseWrapper 是可能的,但它对我不起作用,任何人都可以帮助我。
有没有办法只处理过滤器中的响应.
下面的代码是否正确?
public void doFilter(request , response , chain) {
//code to handle request
chain.doFilter(request, response);
//code to handle response .
}
Run Code Online (Sandbox Code Playgroud)