3

我有一个 Spring 拦截器,它试图在 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() 都不会添加任何标头。

这在拦截器中是否有效?我想它会是,但它不起作用。

问候,达斯汀

4

3 回答 3

1

您是否尝试在 preHandle 方法中设置标题?如果这不起作用,请尝试为容器编写一个过滤器并在其中设置标题。

于 2008-10-29T13:49:38.277 回答
1

嗯,我想通了……有点……

事实证明,Jetty 和 Tomcat 也有同样的问题(推测可能是容器问题)。所以...

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

我在我的代码中发现我在response.setContentLength()对标题做任何事情之前调用了它。如果我将其注释掉,一切正常。

那么,剩下的谜团是,为什么调用会response.setContentLength()锁定并且不允许修改任何标题?我认为内容正文与其他标题没有任何关系。

于 2008-10-29T16:43:55.103 回答
0

我有一个类似的问题,当我在 web.xml 中有以下内容时它可以工作(还没有弄清楚为什么)

<filter>
  <filter-name>etagFilter</filter-name>
    <filter-class>org.springframework.web.filter.ShallowEtagHeaderFilter</filter-class>
</filter>

<filter-mapping>
  <filter-name>etagFilter</filter-name>
  <servlet-name>myServlet</servlet-name>
</filter-mapping>
于 2010-06-22T12:21:21.883 回答