Spring - 处理后修改每个请求的标头(在postHandle中)

mty*_*urt 7 java spring servlets spring-mvc

我想要做的是,在处理请求后为响应添加新标头.我需要检查已处理的HttpStatus代码(在我的情况下401未经授权)并添加新的标头.我知道Spring有拦截器,但无法按照文档中的说明修改响应:

请注意,HandlerInterceptor的postHandle方法并不总是非常适合与@ResponseBody和ResponseEntity方法一起使用.在这种情况下,HttpMessageConverter在调用postHandle之前写入并提交响应,这使得无法更改响应,例如添加标头.相反,应用程序可以实现ResponseBodyAdvice并将其声明为@ControllerAdvice bean或直接在RequestMappingHandlerAdapter上配置它.

好吧,我实施了ResponseBodyAdvice.是的,它允许修改身体,但我无法修改标头,事件无法找到从控制器返回的状态代码.

使用servlet过滤器的另一个选择也不成功.我需要在filterChain.doFilter(servletRequest, servletResponse);通话后添加标题.但它再次不会修改标头值.有没有办法完成这个简单的任务?

Ian*_*rts 10

听起来你正在使用servlet过滤器,你可能需要做的是将servlet响应对象包装一个检测到401状态代码设置的时间,并在那时添加自定义标头:

HttpServletResponse wrappedResponse = new HttpServletResponseWrapper(response) {

  public void setStatus(int code) {
    super.setStatus(code);
    if(code == 401) handle401();
  }

  // three similar methods for the other setStatus and the two
  // versions of sendError

  private void handle401() {
    this.addHeader(...);
  }
};

filterChain.doFilter(request, wrappedResponse);
Run Code Online (Sandbox Code Playgroud)