【问题标题】:Adding HTTP Headers in a Spring Interceptor postHandle method在 Spring Interceptor postHandle 方法中添加 HTTP 标头
【发布时间】:2010-09-19 19:01:34
【问题描述】:

我有一个 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() 都没有添加任何标头。

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

问候, 达斯汀

【问题讨论】:

    标签: spring-mvc


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      我遇到了类似的问题,当我在 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>
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 嗯,我在preHandle方法中做不到,因为我需要设置的header是基于servlet处理结果的,所以必须在postHandle方法中进行。
        • 请使用cmets提问。
        猜你喜欢
        • 1970-01-01
        • 2018-04-17
        • 2018-02-19
        • 2014-07-27
        • 2015-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多