java – 在我的部署中设置Cache-Control no-cache,no-store是什么?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 在我的部署中设置Cache-Control no-cache,no-store是什么?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3773字,纯文字阅读大概需要6分钟。
内容图文
![java – 在我的部署中设置Cache-Control no-cache,no-store是什么?](/upload/InfoBanner/zyjiaocheng/800/aef56d5db8784ed987ec6f8c39b83453.jpg)
我有一个问题,我的应用程序部署总是返回响应标头:
Cache-Control: no-cache
Cache-Control: no-store
Expires:Thu, 01 Jan 1970 00:00:00 GMT
Pragma:no-cache
我正在使用:
春季3.1.2.RELEASE
Primefaces JSF 3.4.1
Spring Webflow 2.3.0.RELEASE
JBoss AS 7.0.1
我已经尝试了几乎我可以找到的应用程序方面的所有解决方案:
>配置WebContentInterceptor(尝试了各种排列)Right out of the box cache-control header filter?
>编写自定义拦截器,添加不同的Cache-Control标头(使用Cache-Control测试:私有)
>编写添加HTTP响应参数的客户过滤器.使用Cache-Control配置它:private作为web.xml中的init-params
>使用context.xml文件(在META-INF /和WEB-INF /中都尝试过)来禁用JBoss / Tomcat http://daveharris.wordpress.com/2007/07/09/how-to-configure-cache-control-in-tomcat/中的Cache-Control
在所有上述情况中,响应头从未结束不同,总是没有缓存,没有存储,1970年到期,pragma:no-cache
我的想法已经不多了,有人知道在我的响应中设置这些标头是什么,所以我可以定位适当的部署组件来解决这个问题吗?
解决方法:
导致这种情况的根代码是在Spring MVC中,从WebContentGenerator调用.此类用作MVC / Webflow堆栈中几个类的基类:WebContentInterceptor(MVC拦截器),AbstractController(MVC控制器),AbstractHandlerMethodAdapter(MVC HandlerAdapter),AnnotationMethodHadlerAdapter(MVC HandlerAdapter),FlowHandlerAdapter(Webflow HandlerAdapter),JsfFlowHandlerAdapter(Webflow JSF HandlerAdapter)
CacheControl seconds设置为0会调用preventCaching方法.因此,应用程序似乎默认设置为0.
org.springframework.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以来,JsfFlowHandlerAdapter首先处理对流/视图的服务器请求.这就是为什么配置拦截器没有帮助的原因,因为JsfFlowHandlerAdapter此时已经设置了Cache-Control和其他HTTP头.事实证明我已经扩展了JsfFlowHandlerAdapter以处理FlowExecutionRestorationFailureException(参见Sping Web Flow Preventing Back Button Use),所以我需要做的就是设置我想要的配置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">
CacheControlInterceptor(设置自己的HTTP标头.在WebContentGenerator中执行它的方法是最终的,所以不能@Override)
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;
}
}
内容总结
以上是互联网集市为您收集整理的java – 在我的部署中设置Cache-Control no-cache,no-store是什么?全部内容,希望文章能够帮你解决java – 在我的部署中设置Cache-Control no-cache,no-store是什么?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。