it-swarm.com.de

Wie füge ich den Cache-Control-Header zu einer statischen Ressource in Spring Boot hinzu?

Wie kann ich Cache-Control-HTTP-Header in Spring Boot für statische Ressourcen hinzufügen? 

Es wurde versucht, eine Filterkomponente in der Anwendung zu verwenden, die Header richtig schreibt, aber Cache-Control-Header wird überschrieben.

@Component
public class CacheBustingFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) 
                                              throws IOException, ServletException {

        HttpServletResponse httpResp = (HttpServletResponse) resp;
        httpResp.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
        httpResp.setHeader("This-Header-Is-Set", "no-cache, no-store, must-revalidate");
        httpResp.setHeader("Expires", "0");

        chain.doFilter(req, resp);
    }

Was ich im Browser bekomme, ist:

Cache-Control:no-store
This-Header-Is-Set:no-cache, no-store, must-revalidate
Expires:0

Was ich möchte, ist:

Cache-Control:no-cache, no-store, must-revalidate
This-Header-Is-Set:no-cache, no-store, must-revalidate
Expires:0
19
MatteKarla

Wie in der Dokumentation von ResourceHandlerRegistry. Es ist ziemlich einfach. (Ich habe momentan keinen Code dazu.) 

Fügen Sie an der Stelle, an der Sie Ihre statischen Ressourcen konfigurieren, einfach die addResourceHandler-Methode hinzu, wird das ResourceHandlerRegistration-Objekt zurückgegeben. 

Dort können Sie die Methode setCacheControl verwenden. Sie müssen ein CacheControl -Objekt konfigurieren und einstellen.

Dies ist seit dem Frühling 4.2, sonst musst du es wie unten machen.

@Configuration
@EnableWebMvc
@ComponentScan("my.packages.here")
public class WebConfig extends WebMvcConfigurerAdapter {


   @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").setCachePeriod(0);
    }

}
11

Dies geschieht aufgrund von Spring Security: Alle Cache-Header werden neu geschrieben, um das Caching vollständig zu deaktivieren. Wir müssen also zwei Dinge tun: 

  1. Deaktivieren Sie die Federsicherheit für statische Ressourcen
  2. Aktivieren Sie die statische Verarbeitung des Ressourcencaches

In der aktuellen Version von Spring Boot können wir dieses Verhalten in der Datei application.properties config ändern.

Deaktivieren Sie die Federsicherheit für einige Ressourcen:

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

Aktivieren Sie das Senden von Cache-Headern für statische Ressourcen:

# Enable HTML5 application cache manifest rewriting.
spring.resources.chain.html-application-cache=true

# Enable the Spring Resource Handling chain. Disabled by default unless at least one strategy has been enabled.
spring.resources.chain.enabled=true
# Enable the content Version Strategy.
spring.resources.chain.strategy.content.enabled=true 
# Comma-separated list of patterns to apply to the Version Strategy.
spring.resources.chain.strategy.content.paths=/** 

# Locations of static resources.
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/

Das ist alles. Jetzt prüft Spring, ob Ihre statischen Dateien geändert wurden, und kann intelligentere Antworten senden (If-Modiffied-Since und andere) und Ihren Appcache auch neu schreiben.

Wenn es Gründe gibt, die inhaltsbasierte Version für einige Ressourcen nicht zu verwenden, können Sie die alternative FixedVersion-Strategie verwenden und die Version in Ihrer Konfiguration explizit festlegen:

#Enable the fixed Version Strategy.
spring.resources.chain.strategy.fixed.enabled=false 
# Comma-separated list of patterns to apply to the Version Strategy.
spring.resources.chain.strategy.fixed.paths= 
# Version string to use for the Version Strategy.
spring.resources.chain.strategy.fixed.version= 

Mehr in Dokumenten

11

Diese Eigenschaften steuern die Standard-Cache-Header für Ressourcen:

spring.resources.cache.cachecontrol.max-age: 3600

https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

2
Mateusz Stefek

Mit Spring Boot 1.3.3 hatte ich eine 404-Antwort mit Maleenc-Antwort ..__, die ich korrigieren konnte, indem ein Ressourcenstandort hinzugefügt wurde:

@Configuration
public class HttpClientConfiguration extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").setCacheControl(CacheControl.maxAge(1, TimeUnit.DAYS))
                .addResourceLocations("/");
    }
}
1
Ronan Fauglas

Maleenc's, die Antwort ist richtig. Bei dieser Implementierung gibt es jedoch ein Problem.

Der folgende Code stellt den korrekten Cache-Steuerungsheader für die erste Anforderung bereit, aber keine zukünftige Anforderung, die 304 (nicht geändert) zurückgibt, gibt den Standard-Cache-Steuerungsheader zurück, der durch die Federsicherheit festgelegt ist. _. {Code} 

public void addResourceHandlers(ResourceHandlerRegistry registry) {         
    registry.addResourceHandler("/resources/**").setCacheControl(CacheControl.maxAge(10, TimeUnit.SECONDS));
}

Ich habe dieses Problem beim Frühlingsteam angesprochen, siehe https://jira.spring.io/browse/SPR-15133 . Hier war die Antwort: "Jetzt sollten Sie die Header der Sicherheits-Cache-Kontrolle für Ihre gesamte Anwendung nicht deaktivieren. Die richtige Methode zum Deaktivieren der Pfade für einen bestimmten Pfad (Ressourcenverwaltung hier) wird in diesem Problemkommentar erläutert, siehe Abschnitt "Abhilfe". "

1
Thomas Jahncke

Spring Boot bietet viele Möglichkeiten, um die http-Ressource zu cachen. Federpaket 2.1.1 und zusätzlich Federsicherung verwenden 5.1.1.

1. Für Ressourcen, die den Ressourcenhandler im Code (UNTESTED) verwenden:

Sie können auf diese Weise benutzerdefinierte Erweiterungen von Ressourcen hinzufügen.

registry.addResourceHandler

Zum Hinzufügen des URI-Pfads, an dem die Ressource abgerufen werden soll

.addResourceLocations

Dient zum Festlegen des Speicherorts im Dateisystem, an dem sich die Ressourcen befinden ( Ist ein relativer Klassenpfad, aber absoluter Pfad mit file :: // ist ebenfalls möglich.)

.setCacheControl

Dient zum Setzen der Cache-Header (selbsterklärend.)

Resourcechain und Resolver sind optional (in diesem Fall genau wie die Standardwerte.)

@Configuration
public class CustomWebMVCConfig implements WebMvcConfigurer {

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/**")
            .addResourceLocations("classpath:/static/")
            .setCacheControl(CacheControl.noStore()
                    .mustRevalidate())
            .setCacheControl(CacheControl.noCache())
            .resourceChain(true)
            .addResolver(new PathResourceResolver());
    }
}

2. Für Ressourcen, die Konfigurationsdateien für Anwendungseigenschaften verwenden

Wie oben, minus der spezifischen Muster, aber jetzt als config . Diese Konfiguration wird auf alle Ressourcen in den aufgelisteten statischen Speicherorten angewendet.

spring.resources.cache.cachecontrol.no-store=true
spring.resources.cache.cachecontrol.must-revalidate=true
spring.resources.cache.cachecontrol.no-cache=true

3. Auf Controller-Ebene

Die Antwort hier ist der HttpServletResponse, der als Parameter in die Controller-Methode eingefügt wurde.

response.setHeader(HttpHeaders.CACHE_CONTROL,
            "no-cache, must-revalidate, no-store");
response.setHeader("Expires", "0");
0
Merv