2010-12-06 100 views
39

如何在spring mvc 3中通过注释设置头部没有缓存?不是如何在spring mvc 3中通过注释设置头部无缓存

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

好问题,但我怀疑有没有办法用注解做到这一点(但) – skaffman 2010-12-06 09:03:48

+0

为什么你选择不直接使用设置响应头但使用拦截器,我认为这不是表现友好? – hakunami 2015-09-15 06:13:35

回答

46

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

<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,它们确实指定了一些响应属性。

19

要针对特定​​的控制器的映射,使用属性对象的cacheMappings上WebContentInterceptor

<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> 

1

覆盖设置我知道这是旧的,但,这可能有助于一些。

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

例如,如果您希望仅在浏览器为IE或仅来自特定网址的情况下禁用缓存,则还可以通过扩展接口来禁用缓存。

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

这是它的一个相当不错的教程:

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