2010-12-06 8 views
39

cómo establecer el encabezado sin caché en primavera mvc 3 mediante anotación? no escómo establecer el encabezado sin caché en mvc 3 de primavera mediante la anotación

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

Buena pregunta, aunque sospecho que no hay manera de hacer esto con anotaciones (aún) – skaffman

+0

por qué se decide no utilizar cabecera de respuesta directamente la configuración del pero usando interceptores, que creo que no es amigable para el rendimiento? – hakunami

Respuesta

46

No existe tal opción. Se puede utilizar un interceptor:

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

(tomado de here)

Por un lado es lógico no tener tales anotación. Las anotaciones sobre los métodos spring-mvc son principalmente para permitir que el contenedor decida qué método invocar (limitándolo por un encabezado de solicitud, url de solicitud o método). Controlar la respuesta no entra en esta categoría.

Por otro lado, sí, será útil tenerlos, porque cuando los controladores se prueban en unidades, no es relevante probar material del encabezado http (¿o no?). Y hay @ResponseBody y @ResponseStatus, que especifican algunas propiedades de respuesta.

+2

Y '@ ResponseStatus' :) – skaffman

+2

ah, sí. Bueno, tal vez mi razonamiento no es del todo correcto :) – Bozho

+1

Solo para comentar esto todavía funciona con Spring webmvc 4. Una solución tan útil y simple. –

19

sustituir la configuración de ciertas asignaciones de controladores utilizan los cacheMappings propiedades del objeto en el 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

Sé que esto es viejo, pero esto podría ser útil para algunos.

Si desea agregar mucha más lógica a la caché y cuando no lo tiene, también puede escribir un interceptor personalizado.

Por ejemplo, si se quiere desactivar el almacenamiento en caché en la respuesta sólo cuando el navegador es Internet Explorer o sólo desde determinadas direcciones URL se puede hacer eso también mediante la ampliación de la interfaz HandlerInterceptor.

Al hacerlo, puede tener mucho control sobre exactamente lo que sucede. No es tan fácil como simplemente configurar el encabezado para todo a la vez o simplemente escribir los cambios a la respuesta en cada controlador, pero tampoco es tan difícil y es una mejor solución a largo plazo en mi opinión. También es bueno saber cómo hacerlo en primavera en general.

Este es un muy buen tutorial para ello:

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

Cuestiones relacionadas