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.
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
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