sirve requestmapping que para mvc modelandview example ejemplo arquitectura java spring caching spring-mvc

java - requestmapping - spring mvc que es



¿Cómo se configuran los encabezados de caché en Spring MVC? (9)

En un controlador Spring MVC basado en anotaciones, ¿cuál es la forma preferida de establecer encabezados de caché para una ruta específica?


Acabo de encontrar el mismo problema y encontré una buena solución que ya proporciona el marco. La clase org.springframework.web.servlet.mvc.WebContentInterceptor permite definir el comportamiento de almacenamiento en caché predeterminado, además de anulaciones específicas de ruta (con el mismo comportamiento de ruta de acceso utilizado en otro lugar). Los pasos para mí fueron:

  1. Asegúrese de que mi instancia de org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter no tenga establecida la propiedad "cacheSeconds".
  2. Agregue una instancia de WebContentInterceptor :

    <mvc:interceptors> ... <bean class="org.springframework.web.servlet.mvc.WebContentInterceptor" p:cacheSeconds="0" p:alwaysUseFullPath="true" > <property name="cacheMappings"> <props> <!-- cache for one month --> <prop key="/cache/me/**">2592000</prop> <!-- don''t set cache headers --> <prop key="/cache/agnostic/**">-1</prop> </props> </property> </bean> ... </mvc:interceptors>

Después de estos cambios, las respuestas en / foo incluían encabezados para desalentar el almacenamiento en caché, las respuestas en / cache / me incluían encabezados para alentar el almacenamiento en caché y las respuestas en / cache / agnostic no incluían encabezados relacionados con el caché.

Si usa una configuración Java pura:

@EnableWebMvc @Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter { /* Time, in seconds, to have the browser cache static resources (one week). */ private static final int BROWSER_CACHE_CONTROL = 604800; @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry .addResourceHandler("/images/**") .addResourceLocations("/images/") .setCachePeriod(BROWSER_CACHE_CONTROL); } }

Ver también: http://docs.spring.io/spring-security/site/docs/current/reference/html/headers.html


Comenzando con Spring 4.2 puedes hacer esto:

import org.springframework.http.CacheControl; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.TimeUnit; @RestController public class CachingController { @RequestMapping(method = RequestMethod.GET, path = "/cachedapi") public ResponseEntity<MyDto> getPermissions() { MyDto body = new MyDto(); return ResponseEntity.ok() .cacheControl(CacheControl.maxAge(20, TimeUnit.SECONDS)) .body(body); } }

CacheControl objeto CacheControl es un generador con muchas opciones de configuración, ver JavaDoc


En su controlador, puede establecer encabezados de respuesta directamente.

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


La respuesta es bastante simple:

@Controller public class EmployeeController {
@RequestMapping(value = "/find/employer/{employerId}", method = RequestMethod.GET) public List getEmployees(@PathVariable("employerId") Long employerId, final HttpServletResponse response) { response.setHeader("Cache-Control", "no-cache"); return employeeService.findEmployeesForEmployer(employerId); }
}
El código anterior muestra exactamente lo que quieres lograr. Tienes que hacer dos cosas. Agregue "respuesta HttpServletResponse final" como su parámetro. Y luego establezca Cache-Control del encabezado en no-cache.


Puede extender AnnotationMethodHandlerAdapter para buscar una anotación de control de caché personalizada y establecer los encabezados http en consecuencia.



Sé que este es realmente viejo, pero aquellos que están buscando en Google, esto podría ayudar:

@Override protected void addInterceptors(InterceptorRegistry registry) { WebContentInterceptor interceptor = new WebContentInterceptor(); Properties mappings = new Properties(); mappings.put("/", "2592000"); mappings.put("/admin", "-1"); interceptor.setCacheMappings(mappings); registry.addInterceptor(interceptor); }


puede definir una anotación para esto: @CacheControl(isPublic = true, maxAge = 300, sMaxAge = 300) , luego represente esta anotación en el encabezado HTTP con el interceptor Spring MVC. o hazlo dinámico:

int age = calculateLeftTiming(); String cacheControlValue = CacheControlHeader.newBuilder() .setCacheType(CacheType.PUBLIC) .setMaxAge(age) .setsMaxAge(age).build().stringValue(); if (StringUtils.isNotBlank(cacheControlValue)) { response.addHeader("Cache-Control", cacheControlValue); }

Implicación se puede encontrar aquí: 优雅的Builder模式

Por cierto: acabo de descubrir que Spring MVC tiene soporte incorporado para el control de caché: Google WebContentInterceptor o CacheControlHandlerInterceptor o CacheControl, lo encontrarás.


org.springframework.web.servlet.support.WebContentGenerator , que es la clase base para todos los controladores de Spring, tiene bastantes métodos que tratan con los encabezados de caché:

/* Set whether to use the HTTP 1.1 cache-control header. Default is "true". * <p>Note: Cache headers will only get applied if caching is enabled * (or explicitly prevented) for the current request. */ public final void setUseCacheControlHeader(); /* Return whether the HTTP 1.1 cache-control header is used. */ public final boolean isUseCacheControlHeader(); /* Set whether to use the HTTP 1.1 cache-control header value "no-store" * when preventing caching. Default is "true". */ public final void setUseCacheControlNoStore(boolean useCacheControlNoStore); /* Cache content for the given number of seconds. Default is -1, * indicating no generation of cache-related headers. * Only if this is set to 0 (no cache) or a positive value (cache for * this many seconds) will this class generate cache headers. * The headers can be overwritten by subclasses, before content is generated. */ public final void setCacheSeconds(int seconds);

Pueden invocarse dentro de su controlador antes de la generación de contenido o especificarse como propiedades de bean en el contexto de Spring.