如何通过注释在spring mvc 3中设置header no cache

时间:2010-12-06 08:53:57

标签: java spring spring-mvc java-ee

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

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

3 个答案:

答案 0 :(得分:47)

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

<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方法的注释主要是让容器决定调用哪个方法(通过请求标头,请求网址或方法来限制它)。控制响应不属于这一类。

另一方面 - 是的,拥有它们会很方便,因为当控制器经过单元测试时,它与测试http头部的东西无关(或者它是什么?)。还有@ResponseBody@ResponseStatus,它们指定了一些响应属性。

答案 1 :(得分:19)

要覆盖某些控制器映射的设置,请使用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>

答案 2 :(得分:1)

我知道这已经过时了,但这可能会对某些人有所帮助。

如果你想在缓存时添加更多逻辑,那么你也可以编写自定义拦截器。

例如,如果您只想在浏览器是IE时禁用响应中的缓存,或者只想从特定网址中禁用缓存,则可以通过扩展 HandlerInterceptor 界面来执行此操作。

通过这样做,您可以对所发生的事情进行大量控制。它并不像一次只设置标题或只是在每个控制器中输入响应的变化那么容易,但它也不是那么难,在我看来是一个更好的长期解决方案。一般来说,知道如何做到这一点也是一件好事。

这是一个非常好的教程:

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