65 votes

Comment définir les en-têtes de cache dans Spring MVC ?

Dans un contrôleur Spring MVC basé sur des annotations, quelle est la meilleure façon de définir les en-têtes de cache pour un chemin spécifique ?

0 votes

Pour les nouveaux utilisateurs, c'est probablement la réponse que vous cherchez

4voto

arganzheng Points 844

Vous pouvez définir une anotation pour cela : @CacheControl(isPublic = true, maxAge = 300, sMaxAge = 300) puis rendre cette anotation dans l'en-tête HTTP avec l'intercepteur de Spring MVC. ou le faire de manière dynamique :

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);
}

L'implication peut être trouvée ici : Mode constructeur élégant

BTW : Je viens de découvrir que Spring MVC a un support intégré pour le contrôle du cache : Google WebContentInterceptor ou CacheControlHandlerInterceptor ou CacheControl, vous le trouverez.

4voto

Liang Zhou Points 542

J'ai trouvé WebContentInterceptor pour être le moyen le plus simple d'y arriver.

@Override
public void addInterceptors(InterceptorRegistry registry)
{
    WebContentInterceptor interceptor = new WebContentInterceptor();
    interceptor.addCacheMapping(CacheControl.noCache(), "/users", "admin");
    registry.addInterceptor(interceptor);
}

3voto

realcnbs Points 83

Je sais que c'est une vieille histoire, mais pour ceux qui font des recherches sur Internet, cela pourrait les aider :

@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);
}

2voto

hakunami Points 375

Dans votre contrôleur, vous pouvez définir les en-têtes de réponse directement.

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

1voto

Vous pourriez étendre AnnotationMethodHandlerAdapter pour rechercher une annotation de contrôle de cache personnalisée et définir les en-têtes http en conséquence.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X