web-dev-qa-db-fra.com

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

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

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

Il n'y a pas une telle option. 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>

(pris de ici )

D'une part, il est logique de ne pas avoir une telle annotation. Les annotations sur les méthodes spring-mvc servent 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 rentre pas dans cette catégorie.

D'un autre côté - oui, il sera pratique de les avoir, car lorsque les contrôleurs sont testés par unité, il n'est pas pertinent de tester les éléments d'en-tête http (ou est-ce?). Et il existe @ResponseBody et @ResponseStatus, qui spécifient certaines propriétés de réponse.

46
Bozho

Pour remplacer les paramètres de certains mappages de contrôleur, utilisez l'objet de propriétés cacheMappings sur 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>

19
Risadinha

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

Si vous souhaitez ajouter beaucoup plus de logique à la mise en cache, vous pouvez également écrire un intercepteur personnalisé. 

Par exemple, si vous souhaitez désactiver la mise en cache dans la réponse uniquement lorsque le navigateur est IE ou uniquement à partir d'URL spécifiques, vous pouvez également le faire en étendant 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 définir l'en-tête pour tout en même temps ou de saisir les modifications apportées à la réponse dans chaque contrôleur, mais ce n'est pas si difficile et c'est une meilleure solution à long terme à mon avis. C'est aussi une bonne chose de savoir faire au printemps en général.

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

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

1
njfife