2010-05-20 13 views
8

Podaję obrazy z mojego serwletu. Typ treści odpowiedzi to image/jpeg. Uważam, że obrazy żądane z mojego serwletu nie są buforowane. Jak mogę je ustawić w pamięci podręcznej, tak jak zwykle są to żądania dotyczące plików obrazów? Próbowałem ustawić Cache-Control: publiczną, ale bez skutku.Buforowanie obrazów obsługiwanych przez serwleta

Odpowiedz

-8

Ok .. wygląda jak domyślne pola nagłówka powinny umożliwić buforowanie. Znalazłem rozwiązanie na innym forum. Wygląda na to, że w odpowiedzi musisz jawnie ustawić długość treści. Ciekawe dlaczego. Myślałem, że HttpServletResponse zrobi to za nas. W każdym razie zadziałało to jak urok, a obraz został ładnie zbuforowany.

+4

Być może mógłbyś podać link do forum, na którym znalazłeś odpowiedź? – Stewart

2

Na przykład, jeśli chcesz buforować je przez 1 miesiąc:

Calendar inOneMonth = Calendar.getInstance(); 
inOneMonth.add(Calendar.MONTH, 1); 

response.setDateHeader("Expires", inOneMonth.getTimeInMillis()); 

(to jest w Filter który obsługuje wzorzec *.jpg, na przykład)

Ale obrazy powinny być domyślnie buforowane - sprawdź filtry i konfiguracje, aby sprawdzić, czy coś nie ustawia nieprawidłowych parametrów pamięci podręcznej.

3

Musisz wysyłać nagłówki ETag, Last-Modified i Expires wzdłuż odpowiedzi. Numer ETag reprezentuje unikalny identyfikator pliku (zwykle składa się z kombinacji nazwy pliku, rozmiaru pliku i ostatnio zmodyfikowanego znacznika czasu). Last-Modified reprezentuje ostatni zmodyfikowany znacznik czasu pliku. Nagłówek Expires określa, jak długo klient może przechowywać plik w pamięci podręcznej. Jeśli pamięć podręczna wygasła i dostępne są ETag lub Last-Modified, klient wyśle ​​żądanie o numer HEAD, aby sprawdzić, czy plik wymaga odnowienia. Jeśli nie, to Expires zostanie po prostu odpowiednio przesunięty.

Można tu znaleźć aplet przykład, który obsługuje to wszystko (i pobierać CV i automatycznej GZIP): FileServlet supporting resume and GZIP

22

Domyślna serwletów obsługujących zawartość statyczną w pojemnikach jak Tomcat nie ustala żadnych nagłówków kontroli cache. Nie potrzebujesz do tego pisać serwletu. Wystarczy utworzyć filtr w ten sposób,

public void doFilter(ServletRequest request, 
     ServletResponse response, 
     FilterChain chain) 
    throws IOException, ServletException { 

    long expiry = new Date().getTime() + cacheAge*1000; 

    HttpServletResponse httpResponse = (HttpServletResponse)response; 
    httpResponse.setDateHeader("Expires", expiry); 
    httpResponse.setHeader("Cache-Control", "max-age="+ cacheAge); 

    chain.doFilter(request, response); 

} 

kiedy chcesz dodać kontrolę cache, wystarczy dodać filtr do zasobów w web.xml. Na przykład:

<filter> 
    <filter-name>CacheControl</filter-name> 
    <filter-class>filters.CacheControlFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>CacheControl</filter-name> 
    <url-pattern>/images/*</url-pattern> 
</filter-mapping> 
+2

Nagłówki pracują w milisekundach, więc 'cacheAge' to liczba sekund, przez którą pliki mają być buforowane. –

+2

Czy ten filtr może być używany również do plików css i javascript? – Shadow

Powiązane problemy