spring mvc 怎么设计缓存

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring mvc 怎么设计缓存相关的知识,希望对你有一定的参考价值。

用于提供如浏览器缓存控制、是否必须有session开启、支持的请求方法类型(GET、POST等)等,该类主要有如下属性:

Set<String> supportedMethods:设置支持的请求方法类型,默认支持“GET”、“POST”、“HEAD”,如果我们想支持“PUT”,则可以加入该集合“PUT”。
boolean requireSession = false:是否当前请求必须有session,如果此属性为true,但当前请求没有打开session将抛出HttpSessionRequiredException异常;

boolean useExpiresHeader = true:是否使用HTTP1.0协议过期响应头:如果true则会在响应头添加:“Expires:”;需要配合cacheSeconds使用;

boolean useCacheControlHeader = true:是否使用HTTP1.1协议的缓存控制响应头,如果true则会在响应头添加;需要配合cacheSeconds使用;

boolean useCacheControlNoStore = true:是否使用HTTP 1.1协议的缓存控制响应头,如果true则会在响应头添加;需要配合cacheSeconds使用;

private int cacheSeconds = -1:缓存过期时间,正数表示需要缓存,负数表示不做任何事情(也就是说保留上次的缓存设置),
1、cacheSeconds =0时,则将设置如下响应头数据:
Pragma:no-cache // HTTP 1.0的不缓存响应头
Expires:1L // useExpiresHeader=true时,HTTP 1.0
Cache-Control :no-cache // useCacheControlHeader=true时,HTTP 1.1
Cache-Control :no-store // useCacheControlNoStore=true时,该设置是防止Firefox缓存

2、cacheSeconds>0时,则将设置如下响应头数据:
Expires:System.currentTimeMillis() + cacheSeconds * 1000L // useExpiresHeader=true时,HTTP 1.0
Cache-Control :max-age=cacheSeconds // useCacheControlHeader=true时,HTTP 1.1

3、cacheSeconds<0时,则什么都不设置,即保留上次的缓存设置。

此处简单说一下以上响应头的作用,缓存控制已超出本书内容:
HTTP1.0缓存控制响应头
Pragma:no-cache:表示防止客户端缓存,需要强制从服务器获取最新的数据;
Expires:HTTP1.0响应头,本地副本缓存过期时间,如果客户端发现缓存文件没有过期则不发送请求,HTTP的日期时间必须是格林威治时间(GMT),如“Expires:Wed, 14 Mar 2012 09:38:32 GMT”;

HTTP1.1缓存控制响应头
Cache-Control :no-cache 强制客户端每次请求获取服务器的最新版本,不经过本地缓存的副本验证;
Cache-Control :no-store 强制客户端不保存请求的副本,该设置是防止Firefox缓存
Cache-Control:max-age=[秒] 客户端副本缓存的最长时间,类似于HTTP1.0的Expires,只是此处是基于请求的相对时间间隔来计算,而非绝对时间。

还有相关缓存控制机制如Last-Modified(最后修改时间验证,客户端的上一次请求时间 在 服务器的最后修改时间 之后,说明服务器数据没有发生变化 返回304状态码)、ETag(没有变化时不重新下载数据,返回304)。

该抽象类默认被AbstractController和WebContentInterceptor继承。
参考技术A spring注入式的cache吧 spring+ehcache

如何通过注释在spring mvc 3中设置标头无缓存

【中文标题】如何通过注释在spring mvc 3中设置标头无缓存【英文标题】:how to set header no cache in spring mvc 3 by annotation 【发布时间】:2011-05-20 20:39:40 【问题描述】:

如何通过注解在spring mvc 3中设置header no cache?不是

  response.setHeader("Pragma","No-cache");     
  response.setHeader("Cache-Control","no-cache");     
  response.setDateHeader("Expires",   0);     

【问题讨论】:

好问题,虽然我怀疑没有办法用注释来做到这一点(还) 为什么选择不直接设置响应头而是使用拦截器,我认为这对性能不友好? 【参考方案1】:

没有这样的选择。您可以使用拦截器:

<mvc:annotation-driven/>
<mvc:interceptors>
    <bean id="webContentInterceptor" 
          class="org.springframework.web.servlet.mvc.WebContentInterceptor">
        <property name="cacheSeconds" value="0"/>
        <property name="useExpiresHeader" value="true"/>
        <property name="useCacheControlHeader" value="true"/>
        <property name="useCacheControlNoStore" value="true"/>
    </bean>
</mvc:interceptors>

(取自here)

一方面,没有这样的注释是合乎逻辑的。 spring-mvc 方法上的注解主要是让容器决定调用哪个方法(通过请求头、请求 url 或方法来限制)。控制响应不属于这一类。

另一方面 - 是的,拥有这些会很方便,因为当控制器进行单元测试时,它与测试 http 标头内容无关(或者是吗?)。还有@ResponseBody@ResponseStatus,它们确实指定了一些响应属性。

【讨论】:

啊,是的。好吧,也许我的推理并不完全正确:) 只是评论这仍然适用于 Spring webmvc 4。这样一个有用、简单的解决方案。 在 Spring 4.2 中你必须使用 setCacheSeconds(0) 和 setCacheControl(CacheControl.noStore())【参考方案2】:

要覆盖某些控制器映射的设置,请使用 WebContentInterceptor 上的 cacheMappings 属性对象

<bean id="webContentInterceptor"
class="org.springframework.web.servlet.mvc.WebContentInterceptor">
<property name="cacheSeconds" value="2100" />
<property name="useExpiresHeader" value="true" />
<property name="useCacheControlHeader" value="true" />
<property name="useCacheControlNoStore" value="true" />
<property name="cacheMappings">
    <props>
        <prop key="/myUncachedController">0</prop>
    </props>
</property>

【讨论】:

【参考方案3】:

我知道这是旧的,但这可能对某些人有帮助。

如果您想在缓存时和不缓存时添加更多逻辑,您还可以编写自定义拦截器。

例如,如果您只想在浏览器为 IE 或仅来自特定 url 时禁用响应中的缓存,您也可以通过扩展 HandlerInterceptor 接口来实现。

通过这样做,您可以对发生的事情有很大的控制权。这并不像一次为所有内容设置标题或只是在每个控制器中输入对响应的更改那么容易,但它也不是那么难,并且在我看来是一个更好的长期解决方案。春季一般知道怎么做也是一件好事。

这是一个很好的教程:

http://www.mkyong.com/spring-mvc/spring-mvc-handler-interceptors-example/

【讨论】:

以上是关于spring mvc 怎么设计缓存的主要内容,如果未能解决你的问题,请参考以下文章

ehcache 或 Spring MVC 的 Spring 缓存中的最佳缓存实践是啥?

Spring MVC (Java),强制页面不缓存

如何使用 Spring MVC 和 Spring Security 为资源处理程序启用 HTTP 缓存

spring mvc 中quartz 怎么去定时调用controller

如何通过注释在spring mvc 3中设置标头无缓存

spring mvc怎么存cookie