淺談Ajax請求與瀏覽器緩衝_AJAX相關

來源:互聯網
上載者:User

在現代Web應用程式中,前端代碼充斥著大量的Ajax請求,如果對於Ajax請求可以使用瀏覽器緩衝,那麼可以顯著地減少網路請求,提高程式響應速度。

1. Ajax Request

使用jQuery架構可以很方便的進行Ajax請求,範例程式碼如下:

$.ajax({  url : 'url',  dataType : "xml",  cache: true,  success : function(xml, status){        }});

非常簡單,注意其中的第4行代碼:cache:true,顯式的要求如果當前請求有緩衝的話,直接使用緩衝。如果該屬性設定為 false,則每次都會向伺服器請求,Jquery的Comments如下:

If set to false, it will force requested pages not to be cached by the browser. Setting cache to false also appends a query string parameter, "_=[TIMESTAMP]", to the URL.

前端的工作也就這麼多了,這樣的話Ajax請求就可以利用瀏覽器緩衝了嗎?

繼續看。

2. Http 協議

Http協議的header部分定義了關於用戶端是否應該做Cache,以及如何做Cache。具體參見Http Header Field Definitions 的 14.9 Cache-Control 和 14.21 Expires。這裡簡單說一下:

Cache-Control

Cache-control用於控制HTTP緩衝(在HTTP/1.0中可能部分沒實現,僅僅實現了Pragma: no-cache)

資料包中的格式:

Cache-Control: cache-directive

cache-directive可以為以下:

request時用到:

| "no-cache"
| "no-store"
| "max-age" "=" delta-seconds
| "max-stale" [ "=" delta-seconds ]
| "min-fresh" "=" delta-seconds
| "no-transform"
| "only-if-cached"
| "cache-extension"

response時用到:

| "public"
| "private" [ "=" <"> field-name <"> ]
| "no-cache" [ "=" <"> field-name <"> ]
| "no-store"
| "no-transform"
| "must-revalidate"
| "proxy-revalidate"
| "max-age" "=" delta-seconds
| "s-maxage" "=" delta-seconds
| "cache-extension"

說明:

-Public  指示響應可被任何緩衝區緩衝。

-Private  指示對於單個使用者的整個或部分響應訊息,不能被共用快取處理。這允許伺服器僅僅描述當使用者的部分響應訊息,此響應訊息對於其他使用者的請求無效。

-no-cache  指示請求或響應訊息不能緩衝(HTTP/1.0用Pragma的no-cache替換)

-no-store  用於防止重要的資訊被無意的發布。在請求訊息中發送將使得請求和響應訊息都不使用緩衝。

-max-age  指示用戶端可以接收生存期不大於指定時間(以秒為單位)的響應。

-min-fresh  指示用戶端可以接收回應時間小於目前時間加上指定時間的響應。

-max-stale  指示用戶端可以接收超出逾時期間的響應訊息。如果指定max-stale訊息的值,那麼用戶端可以

接收超出逾時期指定值之內的響應訊息。

Expires

Expires 表示Cache的有效時間,允許用戶端在這個時間之前不去發請求,等同max-age的效果。但是如果同時存在,則被Cache-Control的max-age覆蓋。
格式:Expires = "Expires" ":" HTTP-date
樣本:Expires: Thu, 01 Dec 1994 16:00:00 GMT

Last-Modified

Last-Modified用GMT格式表明了文檔的最後修改時間,用戶端第二次請求此URL時,會在頭部加入一個屬性,詢問該時間之後檔案是否有被修改過。如果伺服器端的檔案沒有被修改過,則返回狀態是304,內容為空白,這樣就節省了傳輸資料量。

 

3. 我的問題

這幾天在做Web前端的時候,發現用戶端的每次Ajax都會從伺服器端請求資料,而這些資料的即時性沒有那麼高,沒必要每次都請求。

在顯式的給Ajax加上cache為true後,發現問題依舊。於是懷疑是服務端的問題,服務端使用 jersey 搭建了基於Restful的服務,程式碼片段如下:

@GET@Produces("application/xml")public Response getProducts() {     Response.ResponseBuilder response = Response.ok(data);     return response.build();}

添加Cache控制後,進行測試,一切OK。

最後的代碼如下:

@GET@Produces("application/xml")public Response getProducts() {     Response.ResponseBuilder response = Response.ok(data);     // Expires 3 seconds from now..this would be ideally based     // of some pre-determined non-functional requirement.     Date expirationDate = new Date(System.currentTimeMillis() + 3000);     response.expires(expirationDate);     return response.build();}

以上只是範例程式碼,還可以進行更精細的控制,例如使用CacheControl、Last-Modified等等。

以上這篇淺談Ajax請求與瀏覽器緩衝就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援雲棲社區。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.