2010-07-30 44 views
10

Có ai biết làm thế nào để đi về mã hóa một bộ lọc servlet mà sẽ đặt tiêu đề bộ nhớ cache trên một phản ứng cho một tập tin nhất định/loại nội dung? Tôi có một ứng dụng phục vụ rất nhiều hình ảnh và tôi muốn giảm băng thông để lưu trữ nó bằng cách có bộ nhớ cache của trình duyệt mà không thay đổi thường xuyên. Lý tưởng nhất, tôi muốn có thể chỉ định một loại nội dung và có nó đặt tiêu đề thích hợp bất cứ khi nào loại nội dung phù hợp.Bộ lọc Servlet cho bộ nhớ đệm của trình duyệt?

Có ai biết cách thực hiện việc này không? Hoặc, thậm chí tốt hơn, có mã mẫu họ muốn sẵn sàng chia sẻ? Cảm ơn!

Trả lời

15

Trong bộ lọc của bạn có dòng này:

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

Trường hợp wrapper phản ứng trông giống như:

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); 
    } 
} 

Nói tóm lại, điều này tạo ra một wrapper phản ứng, trong đó, về thiết lập kiểu nội dung, thêm hết hạn tiêu đề. (Nếu bạn muốn, bạn có thể thêm bất kỳ tiêu đề khác bạn cần là tốt). Tôi đã sử dụng bộ lọc này + wrapper và nó hoạt động.

See this question về một vấn đề cụ thể mà giải pháp này và giải pháp ban đầu của BalusC.

+3

Ngoài ra, nếu bạn có tất cả các tệp đó trong một thư mục chung, ví dụ: '/ static', sau đó chỉ cần ánh xạ bộ lọc trên' url-pattern' của '/ static/*' để bạn không cần phải kiểm tra kiểu nội dung mọi lúc và chỉ có thể đặt tiêu đề phản hồi trực tiếp. – BalusC

+0

Thao tác này sẽ KHÔNG hoạt động đối với tài nguyên SSL/TLS trên GlassFish do vùng chứa tự động thêm tiêu đề Pragma và Cache-Control. Nếu bạn muốn lưu trữ các tài nguyên này, bạn cần xóa/ghi đè các tiêu đề này bằng một cái gì đó như: super.setHeader ("Pragma", null); và super.setHeader ("Cache-Control", null). Kiểm soát bộ nhớ cache: "công khai" có thể cũng sẽ hoạt động. Lưu ý: Sử dụng null có thể không được di động vì nó không có trong spec. Có thể có một cách để vô hiệu hóa vùng chứa khỏi việc thêm các tiêu đề, nhưng nó không được ghi lại đầy đủ. – Ryan

Các vấn đề liên quan