HTTP/1.1 Cache中Expiration機制

Cache是一種常見的提高系統的運行效率的方法。在HTTP/1.1中,通過Cache的Expiration機制,讓儘可能減少由Client向Server發送請求的次數。這篇博客簡單介紹HTTP Header中與Expiration相關的字段。


1. Expires

Expires早就存在於HTTP/1.0,是由服務器指定的Response過期時間。表明在Expires這個時間點之前,返回的response都是足夠新的或者說是有效的,Client無需再向Server發送請求。Expires表示的是一個絕對的時刻,所以,每次返回的Expires的時間極有可能都不一樣。


下面就用一個例子作爲演示:

我首先自己寫了一個簡單的Servlet,這個Servlet在HTTP response頭部中塞入了Expires信息。

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        long now = System.currentTimeMillis();
        resp.setDateHeader("Expires", now + 3600000);
        ...
    }


當Server啓動以後,我們用Firefox作爲工具檢測我們的請求發送情況以及收到的包頭信息。

當我通過Firefox第一次打開 http://localhost:8080/httpdemo 時,服務器返回的頭部包括了

Expires: "Mon, 31 Mar 2014 18:31:35 GMT"

Expires值表明,在"Mon, 31 Mar 2014 18:31:35 GMT"這個時間之前,這個返回值都是有效的。Client無需再去從Server取信息。如下圖所示:


需要注意的是,這裏的Expires指示告訴Client如果這個response沒有過期,沒有必要再次訪問。但這並不意味着response過期之前,Client不能向Server發送請求。同時,Expires也不意味在response過期以後,Client需要主動的去Server取最新的消息。


2. Cache-control: max-age

在HTTP/1.1這個標準中引入了一個新的字段Cache-control。Cache-control中有一條指令,叫max-age。

Age表示這個Response已經存活了多久了。而max-age表示response最大的存活時間。所以,max-age表明了這條被cache的消息在多長時間段內是有效的。


下面就簡單的用一個例子來做演示:

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.addHeader("Cache-Control", "max-age=3600");
...
    }

我們訪問 http://localhost:8080/httpdemo/ 以後,服務器返回的response中包含了

Cache-Control: "max-age=3600"

表示這個response生成以後一個小時之內都不會過期,也就不需要再向服務器發送請求了。


如果返回的消息中,同時出現了Cache-control: max-age和Expires,那麼以Cache-control: max-age爲準,Expires的聲明將會被覆蓋掉。



3. 更多

可能有比較調皮的同學,用Chrome試了前面的Expires例子,發現Chrome再次向服務器發送了請求。這是爲什麼呢?我們先看看截取到的request:


我們發現Request中的max-age是0,那麼當max-age出現在request中的時候,服務器又會做些什麼呢?


Cache中的Expiration機制還有非常多可以講的東西,但是最最基本的東西就前面的這麼一點兒,想要更多的瞭解Cache中的age計算,可以參考下面提供的鏈接,都是非常好的詳盡參考資料。


參考資料:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html

http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.11

http://www.bitsandpix.com/entry/java-servlet-set-expires-header-with-cache-control/




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章