如何配置Spring以避免设置Pragma No-Cache

时间:2012-01-23 18:00:25

标签: java spring java-ee spring-mvc

我的系统是基于Spring MVC的,我检查了Spring自动设置 PRAGMA:no-cache 。该系统可通过SSL提供给用户。当用户尝试使用INTERNET EXPLORER 7或8下载内容时,会出现“Internet Explorer无法从服务器下载文件”等错误(更多详细信息:http://support.microsoft.com/default.aspx?scid=KB;EN-US;q316431&)。

我尝试配置 WebContentInterceptor ,如下面的代码但不起作用:

<mvc:interceptors>
    <bean id="webContentInterceptor" class="org.springframework.web.servlet.mvc.WebContentInterceptor">
        <property name="cacheSeconds" value="2100" />
        <property name="useExpiresHeader" value="false" />
        <property name="useCacheControlHeader" value="false" />
        <property name="useCacheControlNoStore" value="false" />
    </bean>
</mvc:interceptors>

我能做些什么来避免Spring发送Pragma:no-cache并与Cache Control相关?

问候!

4 个答案:

答案 0 :(得分:7)

您可以编写自己的自定义拦截器并将标头值设置为响应对象。拦截器只是过滤器,因此覆盖过滤器并使用

  

预处理和后处理分别设置请求和响应标头。

如果您想要具体的例子,请告诉我。

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**" />
        <beans:bean id="customInterceptor"
            class="org.example.interceptors.CustomInterceptor">
        </beans:bean>
    </mvc:interceptor>

</mvc:interceptors>




 public class CustomInterceptor implements HandlerInterceptor{

     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView modelAndView) throws Exception {
     response.setHeader(...);}
}

答案 1 :(得分:2)

尝试将缓存秒设置为负值。


如果这没有帮助,您需要覆盖:

   protected final void preventCaching(HttpServletResponse response)

  protected final void applyCacheSeconds(HttpServletResponse response, int seconds, boolean mustRevalidate)

这两种方法都是WebContentGenerator

中的实现

答案 2 :(得分:2)

最简单的方法可能就是停止使用servlet过滤器编写标头。这样就不需要修改Spring配置,并且可以免费获取正确的缓存功能。

public class PragmaFilter implements Filter {

    private static String PRAGMA_HEADER = "Pragma";

    @Override
    public void init(FilterConfig filterConfig) throws ServletException { }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        chain.doFilter(request, new NoPragmaHttpServletResponseWrapper(response));
    }

    @Override
    public void destroy() { }

    private final class NoPragmaHttpServletResponseWrapper extends HttpServletResponseWrapper {

        private NoPragmaHttpServletResponseWrapper(ServletResponse response) {
            super((HttpServletResponse) response);
        }

        @Override
        public void addHeader(String name, String value) {
            if (PRAGMA_HEADER.equals(name)) {
                return;
            }
            super.addHeader(name, value);
        }

        @Override
        public void setHeader(String name, String value) {
            if (PRAGMA_HEADER.equals(name)) {
                return;
            }
            super.setHeader(name, value);
        }
    }

}

答案 3 :(得分:1)

<mvc:interceptors>
    <bean id="webContentInterceptor" class="org.springframework.web.servlet.mvc.WebContentInterceptor">
        <property name="cacheSeconds" value="2100" />
        <property name="useExpiresHeader" value="false" />
        <property name="useCacheControlHeader" value="false" />
        <property name="useCacheControlNoStore" value="false" />
        <property name="cacheMappings">
            <props>
                <prop key="/**/**">-1</prop><!-- removes pragma no-cache -->
            </props>
        </property>
    </bean>
</mvc:interceptors>