在Spring Interceptor postHandle方法中添加HTTP标头


问题内容

我有一个Spring Interceptor,它尝试在postHandle()方法中添加HTTP标头。

public void postHandle(HttpServletRequest req, HttpServletResponse resp, 
             Object obj1, ModelAndView mv)
        throws Exception {
        response.setHeader("SomeHeaderSet", "set");
        response.addHeader("SomeHeaderAdd", "added");
    }
}

但是,两个标头都没有使用setHeader()或addHeader()添加。

在拦截器中这样做甚至有效吗?我想应该会的,但是那行不通。

问候,达斯汀


问题答案:

好吧,我知道了…金田…

原来,Jetty和Tomcat存在相同的问题(图可能是容器问题)。所以…

进行调试以确保响应对象在Spring返回容器之前一直包含正确的标头值。结果:HttpServletResponse实例仍然具有正确的头值。

我在代码中发现我response.setContentLength()在使用标头做任何事情之前都在进行调用。如果我将其注释掉,一切正常。

因此,剩下的奥秘是,为什么调用会response.setContentLength()锁定事物并不允许修改任何标头?我认为内容主体与其他标题无关。