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

Java 如何配置Spring以避免设置Pragma No Cache,java,spring,jakarta-ee,spring-mvc,Java,Spring,Jakarta Ee,Spring Mvc,我的系统是基于Spring MVC的,我检查了Spring是否自动设置了PRAGMA:no cache。用户可以通过SSL访问该系统。当用户尝试使用INTERNET EXPLORER 7或8下载某些内容时,会出现类似“INTERNET EXPLORER无法从服务器下载文件”的错误(详细信息:) 我试图像下面的代码一样配置WebContent Interceptor,但不起作用: <mvc:interceptors> <bean id="webContentInterce

我的系统是基于Spring MVC的,我检查了Spring是否自动设置了PRAGMA:no cache。用户可以通过SSL访问该系统。当用户尝试使用INTERNET EXPLORER 7或8下载某些内容时,会出现类似“INTERNET EXPLORER无法从服务器下载文件”的错误(详细信息:)

我试图像下面的代码一样配置WebContent Interceptor,但不起作用:

<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:无缓存和与缓存控制相关


问候

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


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

   protected final void preventCaching(HttpServletResponse response)


这两种方法都是在
WebContentGenerator

中实现的。您可以编写自己的自定义拦截器,并将头值设置为响应对象。拦截器只是过滤器,所以重写过滤器并使用

prehandle和posthandle分别设置请求和响应头

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

<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(...);}
}

公共类CustomInterceptor实现HandlerInterceptor{
public void postHandle(HttpServletRequest请求、HttpServletResponse响应、对象arg2、ModelAndView ModelAndView)引发异常{
response.setHeader(…);}
}

-1

最简单的方法可能只是停止使用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);
        }
    }

}

嗨,拉尔夫!我不知道会发生什么,但是当Spring启动时,WebContentGenerator的cacheSeconds属性设置为-1(默认设置),但是当调用applyCacheSeconds时,cacheSeconds为0,调用preventCaching。setter方法setCacheSeconds只被调用一次…@Marcelo Juventino:我可以解释这种行为的一种方式是,你“仍然”使用
annnottopnmethodhandler
,就像Tomasz在他的(删除的)答案中建议的那样,而不是像你在问题中写的
WebContentInterceptor
。嗨@Ralph!我尝试了两种解决方案,但都没有解决。下面,@Abhi建议使用HandlerInterceptor,并用preHandler方法实现解决方案。但这并不是一个明确而好的解决方案!问题是WebContentGenerator类根据属性值cacheSeconds(如果为-1,则无标题,否则设置标题)在中创建HTTP标题。而且,在设置了它们之后,不可能从响应中删除它们…请改用HandlerInterceptor,并在posthandle.Hi@Abhi中设置响应!我按照你的建议做了,我用preHandle方法实现了这个解决方案,效果很好!这不是一个好的和明确的解决方案,但解决我的问题无论如何。postHandle方法无法解决此问题,因为HTTP头在执行时已创建。您是否注意到您链接的文章仅适用于IE5和IE6?不,它适用于除IE9之外的所有IE。
<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>
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);
        }
    }

}