Tôi có một servlet trên công cụ Ứng dụng phục vụ hình ảnh.Tiêu đề HTTP liên quan đến bộ nhớ cache bị ghi đè trong phản hồi Servlet trên App Engine
Servlet đặt giá trị tiêu đề HTTP đúng cách để cho biết rằng hình ảnh sẽ được lưu vào bộ nhớ cache. Nhưng App Engine ghi đè các tiêu đề này dẫn đến hình ảnh không được lưu trong bộ nhớ cache.
Lưu ý rằng mã tương tự đã hoạt động trước đó, nhưng nó không hoạt động trong một thời gian.
App tài liệu động cơ nói rằng nếu Cache-Control
, Expires
và Vary
tiêu đề được thiết lập bởi các servlet, họ sẽ bị bỏ lại chưa sửa đổi: https://developers.google.com/appengine/docs/java/runtime#Responses
Đây là mẫu mã của tôi:
response.setContentType("image/jpeg");
//response.setDateHeader("Expires", new Date().getTime() + 60L*24*60*60*1000); // 60 days cache time
//response.addHeader("Cache-Control", "public, max-age=5184000"); // 5_184_000 sec = 60 days cache time
response.addHeader("Cache-Control", "public, max-age=90000"); // 90_000 sec = 25 hours cache time
response.getOutputStream().write(data); // Data is a byte array containing the JPEG image data
(Tôi đã cố gắng đưa tất cả trong đó là nhận xét ra.)
Kiểm tra phản hồi yêu cầu HTTP, phản hồi chứa phần sau ders:
HTTP/1.1 200 OK
status: 200 OK
version: HTTP/1.1
cache-control: public, max-age=90000
cache-control: no-cache, must-revalidate
content-length: 6777
content-type: image/jpeg
date: Sat, 05 Jan 2013 14:11:47 GMT
expires: Fri, 01 Jan 1990 00:00:00 GMT
pragma: no-cache
server: Google Frontend
Như bạn thấy, App Engine chèn cache-control
, expires
và pragma
tiêu đề vô hiệu hóa bộ nhớ đệm. Lưu ý rằng điều này là do yêu cầu có tiêu đề cookie
. Ngoài ra, tài liệu tại số https://developers.google.com/appengine/docs/java/runtime#Responses tuyên bố rằng trong trường hợp này (khi cookie được đặt), Công cụ ứng dụng sẽ định cấu hình bộ nhớ cache thành riêng tư, do đó trình duyệt vẫn có thể lưu vào bộ nhớ cache chứ không phải máy chủ proxy trung gian. Các cookie thậm chí không được tôi thêm nhưng mã Google Analytics (tôi đã bật Google Analytics trên trang).
Tôi đang làm gì sai? Làm thế nào tôi có thể đạt được bộ nhớ đệm thích hợp của phản ứng servlet?
EDIT: Tiếp tục điều tra cho thấy các tập tin cookie được thêm vào yêu cầu bởi vì tôi sử dụng Google Authentication, và nếu người dùng đang đăng nhập bằng tài khoản của mình/cô Google, người sử dụng liên quan đến các tập tin cookie được thêm vào, dễ hiểu. Nếu không có người dùng nào được đăng nhập, bộ đệm ẩn sẽ không bị ghi đè. Vì vậy, câu hỏi tiếp theo của tôi là: Có cách nào để lưu trữ hình ảnh do servlet phân phát khi người dùng đăng nhập bằng tài khoản Google không?
CHỈNH SỬA, GIẢI PHÁP: Google App Engine chỉ tắt bộ nhớ đệm nếu người dùng quản trị ứng dụng là ứng dụng khách. Trong trường hợp này, App Engine sẽ tự động chèn tiêu đề chỉ dành cho quản trị viên, ví dụ như chi phí ước tính của yêu cầu. Đây là thông tin cá nhân nên bộ nhớ đệm có thể hiểu được bị tắt.
Đó là 25 giờ, phải không? độ tuổi tối đa chỉ định giây. 90000 giây = 1500 phút = 25 giờ – NagyI
@NagyI Đúng, đó là lỗi đánh máy. – icza