Frage

Was ist der beste Weg, um die Cache-Steuerungs-Header von statischen Assets in einem Dropwizard-Dienst festzulegen?

Etwas Googeln zeigte einen AssetsBundle-Konstruktor:

AssetsBundle(Zeichenfolge Ressourcenpfad, com.Google.gemeinsam.Cache.CacheBuilderSpec cacheBuilderSpec, Zeichenfolge uriPath)

Bei weiteren Untersuchungen sieht es jedoch aus wie das Paket com.yammer.drop-Assistent.bundles sind seit Version 5.1 nicht mehr Teil von Dropwizard.

Vielleicht fehlt mir etwas Offensichtliches, aber gibt es einen bevorzugten Weg, damit umzugehen?

War es hilfreich?

Lösung

Aufbauend auf der Antwort von Tim Barclay habe ich einen Filter erstellt, der festlegt Cache-Control und Expires ein Jahr in die Zukunft, wenn die angeforderte Ressource eine Datei mit der Erweiterung js, CSS, png, jpg, gif oder svg ist.Andernfalls wird der Cache deaktiviert.

Hoffe, es kann für jemanden hilfreich sein!

protected void setCacheHeaders(Environment environment, String urlPattern, int seconds) {
    FilterRegistration.Dynamic filter = environment.servlets().addFilter(
            "cacheControlFilter",
            new Filter() {
                @Override
                public void init(FilterConfig filterConfig) throws ServletException {

                }

                @Override
                public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

                    HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
                    HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;

                    String[] cacheFileTypes = {"js","css","png","jpg","gif","svg"};
                    String filetypeRequested = FilenameUtils.getExtension(httpServletRequest.getRequestURL().toString());

                    if (httpServletRequest.getMethod() == "GET" && seconds > 0 && Arrays.asList(cacheFileTypes).contains(filetypeRequested)) {
                        httpServletResponse.setHeader("Cache-Control", "public, max-age=" + seconds);
                        Calendar c = Calendar.getInstance();
                        c.setTime(new Date());
                        c.add(Calendar.SECOND, seconds);
                        SimpleDateFormat format = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss zzz", Locale.US);
                        format.setTimeZone(TimeZone.getTimeZone("GMT"));
                        httpServletResponse.setHeader("Expires", format.format(c.getTime()));
                    } else {
                        httpServletResponse.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
                        httpServletResponse.setHeader("Expires", "0");
                        httpServletResponse.setHeader("Pragma", "no-cache");
                    }

                    filterChain.doFilter(servletRequest, servletResponse);

                }

                @Override
                public void destroy() {

                }
            }
    );
    filter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, urlPattern);
}

PS:Ich konnte die akzeptierte Antwort nicht finden, um die einzustellen Expires-header zu arbeiten:

resp.setHeader("Expires", new Date().getTime()+500000 + "");

Meins ist im Vergleich furchtbar aufgebläht, aber es funktioniert:

Calendar c = Calendar.getInstance();
c.setTime(new Date());
c.add(Calendar.SECOND, seconds);
SimpleDateFormat format = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss zzz", Locale.US);
format.setTimeZone(TimeZone.getTimeZone("GMT"));
httpServletResponse.setHeader("Expires", format.format(c.getTime()));

Andere Tipps

falls jemand interessiert ist (was, atmet nach der Anzahl der Ansichten, die diese Frage hatte, sind sie wahrscheinlich nicht), so ist ich das gelöst.

Ich habe eine CacheControlter-Klasse in demselben Paket als meine Servicelklasse erstellt:

generasacodicetagpre.

dann in der Serviceklasse, einfach die Zeile hinzufügen:

generasacodicetagpre.

Natürlich könnten Sie mehr feinerer sein und einen anderen Filter für, sagen, Image-Dateien und CSS-Dateien hinzufügen, aber dies fügt die Header für alle Anfragen hinzu.

aus kommentieren:

für Dropwizard 1.0.6.Registrieren Sie sich einfach mit

generasacodicetagpre.

Falls Sie den Cache nur für jede Anforderung löschen möchten, ist unten die Lösung, die CachebustingFilter verwendet, der von Dropwizard bereitgestellt wird.

    .
  1. Definieren Sie eine benutzerdefinierte Konfiguration, in meinem Fall seine Webconfiguration.Verwenden Sie diese Konfiguration, während Sie Ihre Dropwizard-Anwendung einrichten.

    generasacodicetagpre.

    }

  2. Holen Sie sich die Konfiguration, die Sie in # 1 definiert haben, und registrieren Sie den CachebustingFilter basierend auf seinem Wert.

  3. Fügen Sie dies in Ihrer RUN-Methode hinzu -

    generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top