@ResponseBody注释在响应时重置标头

时间:2011-03-02 00:05:26

标签: java spring http

我正在使用Spring 3.0并具有类似以下内容

@ResponseBody
@RequestMapping(method = RequestMethod.POST, value = "/someUrl")
public String handleSomeUrl(@RequestParam(required = true) Long someId){
    // ...
    return someString;
}

我有一个带有postHandle的拦截器,它被调用并在响应上设置一些没有缓存头。但是,当响应返回到浏览器时,所有这些缓存标头都消失了。有趣的是,如果我删除@ResponseBody注释并使用响应编写器,我会看到拦截器设置的标头。为什么@ResponseBody会覆盖我的标题?

注意:

如果我执行以下操作,我也会在回复中看到正确的标题。这与拦截器的postHandle完全相同。

@ResponseBody
@RequestMapping(method = RequestMethod.POST, value = "/someUrl")
public String handleSomeUrl(@RequestParam(required = true) Long someId, HttpServletRequest request, HttpServletResponse response){
    response.setHeader("Cache-Control","no-store, no-cache, must-revalidate");
    return someString;
}

2 个答案:

答案 0 :(得分:1)

可能与此open issue.有关。它有以下评论:

  

我不认为混合使用是明智的   数学使用HttpServletResponse   和@ResponseBody。

答案 1 :(得分:0)

在你的情况下你可以在preHandle方法上添加这些头文件(因为Spring在postHandle触发之前提交响应,所以在postHandle中添加它们对于从@ResponseBody标记的控制器方法返回的响应不起作用):

public class ControllerHandleInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
       if (handler instanceof HandlerMethod) {
          response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); 
          response.setHeader("Pragma", "no-cache"); 
          response.setHeader("Expires", "0"); 
       }

       return true;
    }

    // other code...
}