2013-01-05 27 views
6

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, ExpiresVary 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, expirespragma 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.

+0

Đó 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

+0

@NagyI Đúng, đó là lỗi đánh máy. – icza

Trả lời

4

Theo tài liệu, tiêu đề chỉ nên được ghi đè nếu người dùng đã đăng nhập là quản trị viên. Bạn đã kiểm tra xem đây có phải là trường hợp không?

+0

Vâng, chính xác là như vậy. Tôi đã phát hiện ra nó tuần trước, chỉ quên để cập nhật các bài viết. Làm nó bây giờ. – icza

+0

Đồng thời chấp nhận câu trả lời của bạn ngay cả khi nó đã được giải quyết trước đó. – icza

+0

Cảm ơn, rất vui vì bạn đã cố gắng khắc phục. –

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