2010-07-30 11 views
10

Czy ktoś wie, jak zabrać się za kodowanie filtru serwletów, który ustawi nagłówki cache na odpowiedź dla danego pliku/typu zawartości? Mam aplikację, która obsługuje wiele obrazów, i chciałbym zmniejszyć przepustowość w zakresie hostingu, ponieważ pamięć podręczna przeglądarki zawiera te, które nie zmieniają się zbyt często. Idealnie chciałbym móc określić typ zawartości i ustawić odpowiednie nagłówki za każdym razem, gdy typ zawartości jest zgodny.Filtr serwletów do buforowania przeglądarki?

Czy ktoś wie, jak to zrobić? Lub, jeszcze lepiej, masz przykładowy kod, który chcieliby udostępnić? Dzięki!

Odpowiedz

15

w filtrze mieć ten wiersz:

chain.doFilter(httpRequest, new AddExpiresHeaderResponse(httpResponse)); 

Gdzie obwoluta reakcja wygląda następująco:

class AddExpiresHeaderResponse extends HttpServletResponseWrapper { 

    public static final String[] CACHEABLE_CONTENT_TYPES = new String[] { 
     "text/css", "text/javascript", "image/png", "image/jpeg", 
     "image/gif", "image/jpg" }; 

    static { 
     Arrays.sort(CACHEABLE_CONTENT_TYPES); 
    } 

    public AddExpiresHeaderResponse(HttpServletResponse response) { 
     super(response); 
    } 

    @Override 
    public void setContentType(String contentType) { 
     if (contentType != null && Arrays.binarySearch(CACHEABLE_CONTENT_TYPES, contentType) > -1) { 
      Calendar inTwoMonths = GeneralUtils.createCalendar(); 
      inTwoMonths.add(Calendar.MONTH, 2); 

      super.setDateHeader("Expires", inTwoMonths.getTimeInMillis()); 
     } else { 
      super.setHeader("Expires", "-1"); 
      super.setHeader("Cache-Control", "no-store, no-cache, must-revalidate"); 
     } 
     super.setContentType(contentType); 
    } 
} 

w skrócie, to tworzy otoki odpowiedzi, która na ustawienie typu treści, dodaje nagłówek wygasania. (Jeśli chcesz, możesz dodać inne potrzebne nagłówki). Używałem tego filtra + opakowania i działa.

See this question w sprawie jednego konkretnego problemu, który rozwiązuje, oraz oryginalnego rozwiązania BalusC.

+3

Ewentualnie, jeśli masz te wszystkie pliki we wspólnym folderze, np '/ static', a następnie po prostu zamapuj filtr na' wzorzec url ''/static/* ', aby nie trzeba było sprawdzać typu zawartości za każdym razem i można bezpośrednio ustawić nagłówki odpowiedzi. – BalusC

+0

To NIE będzie działać dla zasobów SSL/TLS na GlassFish, ponieważ kontener automatycznie dodaje nagłówki Pragma i Cache-Control. Jeśli chcesz buforować te zasoby, musisz usunąć/zastąpić te nagłówki przez coś w stylu: super.setHeader ("Pragma", null); i super.setHeader ("Cache-Control", null). Cache-Control: "public" prawdopodobnie też by działało. Uwaga: użycie wartości null może nie być przenośne, ponieważ nie jest w specyfikacji. Może istnieć sposób wyłączenia kontenera przed dodaniem nagłówków, ale nie jest on dobrze udokumentowany. – Ryan

Powiązane problemy