2010-12-06 105 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/