2010-12-06 13 views
39

comment définir l'en-tête pas de cache au printemps mvc 3 par annotation? n'est pascomment définir l'en-tête pas de cache au printemps mvc 3 par annotation

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

Bonne question, bien que je soupçonne qu'il n'y a aucun moyen de le faire avec des annotations (encore) – skaffman

+0

pourquoi vous choisissez de ne pas utiliser en-tête de réponse réglage directement mais en utilisant des intercepteurs, qui je pense ne sont pas adaptés à la performance? – hakunami

Répondre

46

Il n'existe aucune option de ce type. Vous pouvez utiliser un intercepteur:

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

(prise de here)

D'une part, il est logique de ne pas avoir une telle annotation. Les annotations sur les méthodes spring-mvc consistent principalement à laisser le conteneur décider de la méthode à invoquer (en le limitant par un en-tête de requête, une URL de requête ou une méthode). Contrôler la réponse ne tombe pas dans cette catégorie. D'autre part - oui, il sera pratique de les avoir, car lorsque les contrôleurs sont testés unitairement, il n'est pas pertinent de tester les en-têtes http (ou est-ce?). Et il y a @ResponseBody et @ResponseStatus, qui spécifient certaines propriétés de réponse.

+2

Et '@ ResponseStatus' :) – skaffman

+2

ah, oui. Eh bien, peut-être mon raisonnement n'est pas entièrement correct :) – Bozho

+1

Juste pour commenter cela fonctionne toujours avec Spring webmvc 4. Une telle solution utile et simple. –

19

Pour remplacer les paramètres de certains contrôleurs utilisent mappings les propriétés cacheMappings objet sur le 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

Je sais que c'est vieux, mais cela pourrait être utile à certains.

Si vous voulez ajouter beaucoup plus de logique à la mise en mémoire cache et que vous ne pouvez pas écrire un intercepteur personnalisé.

Par exemple, si vous vouliez désactiver la mise en cache dans la réponse que lorsque le navigateur est IE ou seulement de urls spécifiques, vous pouvez le faire aussi bien par l'extension de l'interface HandlerInterceptor.

En faisant cela, vous pouvez avoir beaucoup de contrôle sur ce qui se passe exactement. Ce n'est pas aussi simple que de simplement définir l'en-tête pour tout en même temps ou simplement saisir les modifications de la réponse dans chaque contrôleur mais ce n'est pas si difficile et c'est une meilleure solution à long terme selon moi. C'est aussi une bonne chose de savoir comment faire au printemps en général.

C'est un très bon tutoriel pour elle:

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