我正在使用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;
}
答案 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...
}