Comment activer la mise en cache de la réponse HTTP dans l’amorçage Spring

J’ai implémenté un serveur REST utilisant Spring Boot 1.0.2. J’ai du mal à empêcher Spring de définir des en-têtes HTTP qui désactivent la mise en cache HTTP.

Mon contrôleur est comme suit:

@Controller public class MyRestController { @RequestMapping(value = "/someUrl", method = RequestMethod.GET) public @ResponseBody ResponseEntity myMethod( HttpServletResponse httpResponse) throws SQLException { return new ResponseEntity("{}", HttpStatus.OK); } } 

Toutes les réponses HTTP contiennent les en-têtes suivants:

 Cache-Control: no-cache, no-store, max-age=0, must-revalidate Expires: 0 Pragma: no-cache 

J’ai essayé ce qui suit pour supprimer ou modifier ces en-têtes:

  1. Appelez setCacheSeconds(-1) dans le contrôleur.
  2. Appelez httpResponse.setHeader("Cache-Control", "max-age=123") dans le contrôleur.
  3. Définissez @Bean qui renvoie WebContentInterceptor pour lequel j’ai appelé setCacheSeconds(-1) .
  4. Définissez la propriété spring.resources.cache-period sur -1 ou une valeur positive dans application.properties .

Aucune de ces réponses n’a eu d’effet. Comment puis-je désactiver ou modifier ces en-têtes pour toutes les demandes ou les requêtes individuelles dans Spring Boot?

Désactive les en-têtes HTTP no-cache définis par Spring Security. Ceci est discuté dans http://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#headers .

Ce qui suit désactive l’en-tête de réponse HTTP Pragma: no-cache , mais ne résout pas le problème autrement:

 import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.annotation.web.servlet.configuration.EnableWebMvcSecurity; @Configuration @EnableWebMvcSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { // Prevent the HTTP response header of "Pragma: no-cache". http.headers().cacheControl().disable(); } } 

J’ai fini par désactiver complètement la sécurité Spring pour les ressources statiques publiques comme suit (dans la même classe que ci-dessus):

 @Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers("/static/public/**"); } 

Cela nécessite la configuration de deux gestionnaires de ressources pour obtenir les en-têtes de contrôle de cache à droite:

 @Configuration public class MvcConfigurer extends WebMvcConfigurerAdapter implements EmbeddedServletContainerCustomizer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // Resources without Spring Security. No cache control response headers. registry.addResourceHandler("/static/public/**") .addResourceLocations("classpath:/static/public/"); // Resources controlled by Spring Security, which // adds "Cache-Control: must-revalidate". registry.addResourceHandler("/static/**") .addResourceLocations("classpath:/static/") .setCachePeriod(3600*24); } } 

Voir aussi Servir des ressources Web statiques dans l’application Spring Boot & Spring Security .

J’ai trouvé cette extension de spring: https://github.com/foo4u/spring-mvc-cache-control .

Vous devez juste faire trois étapes.

Étape 1 (pom.xml):

  net.rossillo.mvc.cache spring-mvc-cache-control 1.1.1-RELEASE comstack  

Étape 2 (WebMvcConfiguration.java):

 @Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new CacheControlHandlerInterceptor()); } } 

Étape 3 (contrôleur):

 @Controller public class MyRestController { @CacheControl(maxAge=31556926) @RequestMapping(value = "/someUrl", method = RequestMethod.GET) public @ResponseBody ResponseEntity myMethod( HttpServletResponse httpResponse) throws SQLException { return new ResponseEntity("{}", HttpStatus.OK); } } 

Spring Security désactive vos en-têtes de mise en cache. Si vous avez des réponses dynamics qui n’ont pas besoin d’être sécurisées et que vous souhaitez utiliser des en-têtes http pour les mettre en cache – il suffit d’accéder à votre application.

 # Comma-separated list of paths to exclude from the default secured security.ignored= /someUrl1 

Voir plus dans docs

Je rencontre le même problème. Je voulais juste récupérer certaines des ressources dynamics (images) mises en cache dans le navigateur. Si l’image change (pas très souvent) je change la partie de uri … C’est ma sollution

  http.headers().cacheControl().disable(); http.headers().addHeaderWriter(new HeaderWriter() { CacheControlHeadersWriter originalWriter = new CacheControlHeadersWriter(); @Override public void writeHeaders(HttpServletRequest request, HttpServletResponse response) { Collection headerNames = response.getHeaderNames(); Ssortingng requestUri = request.getRequestURI(); if(!requestUri.startsWith("/web/eventImage")) { originalWriter.writeHeaders(request, response); } else { //write header here or do nothing if it was set in the code } } }); 
 @Configuration @EnableAutoConfiguration public class WebMvcConfiguration extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/resources/**") .addResourceLocations("/resources/") .setCachePeriod(31556926); } }