2013-06-25 14 views
8

Tôi có một ứng dụng web cho phép bộ nhớ cache của trình duyệt yêu cầu AJAX kết quả trong một thời gian dài. Tôi đã tìm hiểu cách thực hiện yêu cầu bỏ qua toàn bộ bộ nhớ cache, khi phát hiện sửa đổi có thể xảy ra. Nhưng tôi muốn cho phép người dùng kích hoạt làm mới dữ liệu.Buộc yêu cầu AJAX để xác thực lại bộ nhớ cache với máy chủ, mà không cần tải lại hoàn toàn

Trong trường hợp này, tôi muốn trình duyệt kiểm tra với máy chủ nếu bộ nhớ cache bị ngừng nhưng sử dụng nó nếu nó không phải là (tức là nếu máy chủ phản hồi bằng mã 304). Mục đích là để dành thời gian tải vì dữ liệu rất lớn.

Các máy chủ bao gồm các tiêu đề sau đây trong tất cả các phản ứng:

Cache-Control: private, max-age=604800 
Last-Modified: ... # actual last modification date 

tôi quản lý để bật các đối tượng được lưu trữ hoàn toàn trong Chrome (không kiểm tra các trình duyệt khác chưa) bằng cách sử dụng các tiêu đề HTTP sau trong yêu cầu:

Cache-Control: max-age=0 
If-Last-Modified: Tue, 01 Jan 1970 01:00:00 +0100 

Dòng If-Last-Modified là dòng thực sự có hiệu lực. Chrome có vẻ bỏ qua tiêu đề Cache-Control trong yêu cầu.

Tôi cũng thấy rằng việc sử dụng Cache-Control: must-revalidate trong phản hồi của máy chủ sẽ buộc trình duyệt xác thực bộ nhớ cache của máy chủ với yêu cầu mỗi yêu cầu.

Nhưng có cách nào để xác thực lại chỉ một yêu cầu chính xác, được quyết định ở phía máy khách không?

Lưu ý rằng tôi không được gắn đặc biệt để thực hiện điều này với tiêu đề HTTP, vì vậy bất kỳ phương pháp nào khác mà tôi không biết là được hoan nghênh!

+0

Vì vậy, chỉ cần sử dụng 'If-Last-Modified' với tiêu đề phản hồi' Last-Modified' cuối cùng. –

+0

Tôi đã thử điều đó và tôi nhận được 304 từ máy chủ, nhưng trình duyệt không sử dụng bộ nhớ cache để điền vào phản hồi, vì vậy nó trống trong mã ... Tôi cho rằng trình duyệt không hiển thị sự quan tâm trong tiêu đề 'If-Last-Modified' mà nó chưa tự thêm vào. – rixo

+0

Sau đó, giả sử bạn tự lưu trữ phản hồi cuối cùng, bạn phải thực hiện việc này theo cách thủ công, tức là nếu phản hồi là 200, ghi đè bộ nhớ cache của bạn và nếu câu trả lời là 304, hãy sử dụng bản sao cũ. Nó có thể dễ dàng trừu tượng hóa. –

Trả lời

2

bạn có thể thêm thông số url có giá trị dựa trên thời gian để xóa bộ nhớ cache chỉ với một yêu cầu chính xác.

$.ajax({ 
    url:"/questions?nocache="+Date.now(), 
    "success":function(data){ 
     console.log(data); 
    } 
}); 
+1

Tôi không muốn bỏ qua bộ nhớ cache hoàn toàn, tôi muốn trình duyệt hỏi máy chủ nếu bộ nhớ cache của nó vẫn hợp lệ và sử dụng bộ nhớ cache nếu nó nhận được 304. Bộ nhớ cache sẽ chỉ bị hủy nếu máy chủ trả lời 200. – rixo

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