当前位置: 首页 > 知识库问答 >
问题:

在我的部署中设置Cache-Control no-cache,no-store是什么?

韦星文
2023-03-14
Cache-Control: no-cache
Cache-Control: no-store
Expires:Thu, 01 Jan 1970 00:00:00 GMT
Pragma:no-cache



我正在使用:

Spring 3.1.2.发布

Primefaces JSF 3.4.1

    null

我没有什么想法了,有人知道是什么在我的响应中设置这些头,以便我可以针对适当的部署组件来解决这个问题吗?

共有1个答案

苏波涛
2023-03-14

导致这种情况的根代码在Spring MVC中,从WebContentGenerator调用。该类用作MVC/Webflow堆栈中几个类的基类:WebContentInterceptor(MVC interceptor)、AbstractController(MVC controller)、AbstractHandlerMethodAdapter(MVC HandlerAdapter)、AnnotationMethodHadlerAdapter(MVC HandlerAdapter)、FlowHandlerAdapter(MVC HandlerAdapter)、FlowHandlerAdapter(Webflow HandlerAdapter)、JSFlow HandlerAdapter(Webflow HandlerAdapter)

CacheControl seconds设置为0调用preventCaching方法。因此,应用程序似乎默认设置为0。

web.servlet.support.WebContentGenerator

protected final void preventCaching(HttpServletResponse response) {
    response.setHeader(HEADER_PRAGMA, "no-cache");
    if (this.useExpiresHeader) {
        // HTTP 1.0 header
        response.setDateHeader(HEADER_EXPIRES, 1L);
    }
    if (this.useCacheControlHeader) {
        // HTTP 1.1 header: "no-cache" is the standard value,
        // "no-store" is necessary to prevent caching on FireFox.
        response.setHeader(HEADER_CACHE_CONTROL, "no-cache");
        if (this.useCacheControlNoStore) {
            response.addHeader(HEADER_CACHE_CONTROL, "no-store");
        }
    }
}

我发现,由于我使用的是JSF+Webflow,JSFloWHandlerAdapter首先处理对流/视图的服务器请求。这就是为什么配置拦截器没有帮助,因为JsfFlowHandlerAdapter此时已经设置了Cache-Control和其他HTTP头。事实证明,我已经扩展了JsfFlowHandlerAdapter来处理FlowExecutionRestorationFailureException(请参见Sping Web Flow防止Back按钮的使用),所以我所需要做的就是设置我想要的配置ala WebContentInterceptor(因为这些配置属于基类WebContentGenerator)。

自定义JsfFlowHandlerAdapter

public class MyAppFlowHandlerAdapter extends org.springframework.faces.webflow.JsfFlowHandlerAdapter {
     ...
    }

webmvc-config.xml

<!-- Dispatches requests mapped to flows to FlowHandler implementations -->
    <bean
        class="com.myapp.MyAppFlowHandlerAdapter">
        <property name="flowExecutor" ref="flowExecutor" />
            <!-- Disable built in Cache-Control settings -->
        <property name="cacheSeconds" value="-1" />
        <property name="useExpiresHeader" value="false" />
        <property name="useCacheControlHeader" value="false" />
        <property name="useCacheControlNoStore" value="false" />
    </bean>

<!-- Maps request paths to flows in the flowRegistry; e.g. a path of /hotels/booking 
    looks for a flow with id "hotels/booking" -->
<bean class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping">
    <!-- snip out unimportant -->
    <property name="interceptors">
        <list>
            <ref bean="cacheControlInterceptor" />  
        </list>
    </property>
</bean>
    <bean id="cacheControlInterceptor"
    class="com.myapp.CacheControlInterceptor">
public class CacheControlInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            //Example below: set your Cache-Control, expires, pragma headers here
        response.setHeader("Cache-Control", "private");

        return true;
    }
}
 类似资料:
  • 上面是mdn的一个例子,为什么no-store和no-cache同时出现,那不相当于no-store吗?

  • 问题内容: 使用Alpine映像创建Dockerfile时,我经常看到提交时使用和的用法,而是看到。 我很好奇,知道利用消除了以后再做的必要。我还想知道一种风格是否胜过另一种。 问题答案: 该选项允许不在本地缓存索引,这对于保持容器较小非常有用。 从字面上看,它在开头和结尾相等。 我们使用option的一些示例: 另一个不使用选项的示例: 如您所见,这两种情况都是有效的。对我来说,使用option

  • 我用的是Chrome40(所以一些漂亮和现代的东西)。 在所有页面上都设置了no-cache-所以我希望浏览器只在首先检查服务器并得到响应时才使用其缓存中的某些内容。 然而,在按下后退按钮时,浏览器会愉快地点击自己的缓存,而无需与服务器进行检查。 我认为我可以使用作为的一个轻量级替代方案,在这里我不希望用户通过后退按钮看到陈旧的数据(但是数据是无价值的,因此可以缓存)。 我对的理解是浏览器必须始终

  • 如果我正确解释了规范,将: null 这与相同吗?这会对性能有任何影响吗?还是只会浪费缓存中的空间,抵消缓存的好处? 目标是缓存需要登录的文件,以改善交付并减少带宽/服务器需求。这些文件不会改变,但确实需要经过身份验证的用户。

  • 来自RFC 2616 http://www.w3.org/protocols/rfc2616/rfc2616-sec14.html#sec14.9.1 与之相比 必须-重新验证 当缓存接收到的响应中存在必须重新验证指令时,该缓存在条目过期后不得使用该条目来响应后续请求,而不首先使用原始服务器重新验证该条目 特别是关于,用户代理实际上是这样根据经验对待这个指令的吗? 如果有和,有什么意义? 请参阅以