2 votes

L'application web Spring boot n'a pas d'en-tête cache-control

J'utilise une application Spring boot et il est nécessaire d'activer la sécurité en désactivant la mise en cache entre les pages web. Si j'ai bien compris, par défaut, Spring Security définit des valeurs d'en-tête cache-control spécifiques pour nous, sans que nous ayons à configurer quoi que ce soit.

Mais pour mon application web, les en-têtes de réponse suivants ne sont pas présents. Cache-Control", "no-store" Pragma", "no-cache" Expires", "0" J'ai essayé de les définir en utilisant un intercepteur (implémentant HandlerInterceptor) et en ajoutant le code suivant dans preHandle, postHandle et afterCompletionMethod.

    response.setHeader("Cache-Control", "no-store"); // HTTP 1.1.
    response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
    response.setHeader("Expires", "0"); // Proxies. 

Bien que le contrôle arrive à ces méthodes et que l'en-tête soit défini, lorsque j'inspecte le navigateur web, je ne vois pas ces en-têtes.

Quelle peut en être la raison ?

2voto

David Stäheli Points 23

Il existe différents types de mise en place de l'en-tête.

Je suggérerais de le définir soit avec un filtre, soit avec la configuration.

Configuration

Par défaut, Spring-Boot définit des en-têtes de sécurité. La fonction .defaultsDisabled() permet de les désactiver et d'activer sélectivement les en-têtes souhaités.

@EnableWebSecurity
public class WebSecurityConfig extends
WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
    // ...
    .headers()
        // do not use any default headers unless explicitly listed
        .defaultsDisabled()
        .cacheControl();
}
}

Définit l'en-tête selon les paramètres suivants :

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

Pour plus de détails sur la configuration, voici la documentation. https://docs.spring.io/spring-security/site/docs/4.0.x/reference/html/headers.html

Vous pouvez également utiliser un filtre.

Filtre

@WebFilter("/filter-response-header/*")
public class AddResponseHeaderFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, 
      FilterChain chain) throws IOException, ServletException {
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
        httpServletResponse.setHeader(
          "Cache-Control", "no-store");
httpServletResponse.setHeader(
              "Pragma", "no-cache");
httpServletResponse.setHeader(
              "Expires", "0");
        chain.doFilter(request, response);
    }

Pour une seule réponse

HttpServletResponse :

HttpServletResponse response
response.addHeader("Cache-Control", "no-store");
response.addHeader("Pragma", "no-cache");
response.addHeader("Expires", "0");

Pour en savoir plus, cliquez ici : https://www.baeldung.com/spring-response-header

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