<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 495,comments - 227,trackbacks - 0
    http://www.jdon.com/40381


    Last-Modified和Expires針對瀏覽器,而ETag則與客戶端無關,所以可適合REST架構中。兩者都應用在瀏覽器端的區別是:Expires日期到達前,瀏覽器不會再發出新的請求,除非用戶按瀏覽器的刷新,所以,Last-Modified和Expires基本是降低瀏覽器向服務器發出請求的次數,而ETag更側重客戶端和服務器之間聯系。

    先談Last-Modified和Expires,最新的Tomcat 7 將ExpireFilter加入其容器中,這樣,Java WEB也可以象Apache的Mod_expire模塊一樣對Http頭部進行統一設置了,不過它只對響應文檔類型進行統一設置判斷,如text/html或text/image 或/css等等,如果想對個別URL輸出的jsp進行定制就不行,urlrewrite據說是可以,但是要把URL在其配置文件再配置一下,麻煩,一旦jsp改動影響面大,還有一個問題就是web.xml配置了Tomcat 7容器的ExpireFilter,與容器耦合,移植性差(移植到Resin就不行了)。

    所以,我在JiveJdon 4.2最新版本中,通過加入下面一段代碼在服務器端對來自客戶端的Last-Modified以及當前時間進行判斷,如未過期,response.setStatus設為304,可以終止后面的各種Jsp界面計算,直接返回瀏覽器一個304的響應包,JSP頁面也不會輸出到客戶端,將帶寬節省給更加需要互動實時性的請求。

    再談談ETag,ETag定義:RFC2616(也就是HTTP/1.1)中沒有說明ETag該是什么格式的,只要確保用雙引號括起來就行了,所以你可以用文件的hash,甚至是直接用Last-Modified,以下是服務器端返回的格式:
    ETag: "50b1c1d4f775c61:df3" 客戶端向服務端發出的請求:If-None-Match: W/"50b1c1d4f775c61:df3" 這樣,在J2EE/JavaEE服務器端,我們判斷如果ETag沒改變也是返回狀態304,起到類似Last-Modified和Expires效果。

    與Last-Modified和Expires區別是:如果過了Expires日期,服務器肯定會再次發出JSP完整響應;或者用戶強按瀏覽器的刷新按鈕,服務器也必須響應,apache等靜態頁面輸出也是這樣,但是這時動態頁面就發揮了作用,如果JSP涉及的業務領域模型還是沒有更新,和原來一樣,那么就不必再將動態頁面輸出了(瀏覽器客戶端已有一份),從Etag中獲取上次設置的領域模型對象修改日期,和現在內存中領域模型(In-memory Model)修改日期進行比較,如果修改日期一致,表示領域模型沒有被更新過,那么返回響應包304,瀏覽器將繼續用本地緩存的該頁面,再次節省了帶寬傳輸。

    通過上述Expire和Etag兩次緩存,可以大大降低服務器的響應負載,如果你的應用不是狀態集中并發修改和實時輸出,而是分散修改然后分發,如個人空間 個人博客(每個人只是修改它們自己的狀態,不影響全局)或QQ類似個人工具,那么采取這樣的方法效果非常明顯,實際就是一種動態頁面靜態化技術,但比通常事先進行頁面靜態化要靈活強大。

    InfoQ的那篇:http://www.infoq.com/articles/etags還用MD5計算放入其中,Md5計算稍微復雜點,負載大了點,有的人結合Hibernate或數據庫觸發器來判斷數據庫數據是否更新,以決定Etag的更新,這將表現層和持久層耦合在一起,由于JiveJdon采取的是MDD/DDD模型驅動架構,表現層的Etag更新是根據中間業務層的模型對象修改日期來決定,不涉及數據庫層,而且起到服務器緩存的更新和http的Etag更新一致的效果,在松耦合設計和性能上取得綜合平衡。

    代碼如下:

    public static boolean checkHeaderCache(long adddays, long modelLastModifiedDate, HttpServletRequest request, HttpServletResponse response) {
    // com.jdon.jivejdon.presentation.filter.ExpiresFilter
    request.setAttribute(
    "myExpire", adddays);

    // convert seconds to ms.
    long adddaysM = adddays * 1000;
    long header = request.getDateHeader(
    "If-Modified-Since");
    long now = System.currentTimeMillis();
    if (header > 0 && adddaysM > 0) {
    if (modelLastModifiedDate > header) {
    // adddays = 0; // reset
    response.setStatus(HttpServletResponse.SC_OK);
    return true;
    }
    if (header + adddaysM > now) {
    // during the period happend modified
    response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
    return false;
    }
    }

    // if over expire data, see the Etags;
    // ETags if ETags no any modified
    String previousToken = request.getHeader(
    "If-None-Match");
    if (previousToken != null && previousToken.equals(Long.toString(modelLastModifiedDate))) {
    // not modified
    response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
    return false;
    }
    // if th model has modified , setup the new modified date
    response.setHeader(
    "ETag", Long.toString(modelLastModifiedDate));
    setRespHeaderCache(adddays, request, response);
    return true;

    }

    public static boolean setRespHeaderCache(long adddays, HttpServletRequest request, HttpServletResponse response) {
    request.setAttribute(
    "myExpire", adddays);

    long adddaysM = adddays * 1000;
    String maxAgeDirective =
    "max-age=" + adddays;
    response.setHeader(
    "Cache-Control", maxAgeDirective);
    response.setStatus(HttpServletResponse.SC_OK);
    response.addDateHeader(
    "Last-Modified", System.currentTimeMillis());
    response.addDateHeader(
    "Expires", System.currentTimeMillis() + adddaysM);
    return true;
    }


    posted on 2013-09-26 17:35 SIMONE 閱讀(1837) 評論(0)  編輯  收藏 所屬分類: JSP
    主站蜘蛛池模板: 午夜电影免费观看| 国产精品视频免费一区二区| 四虎影视永久免费视频观看| 亚洲最大av资源站无码av网址| 国产大片免费网站不卡美女| 亚洲综合在线观看视频| 97在线视频免费公开观看| 亚洲第一永久在线观看| 麻豆国产精品免费视频| 91丁香亚洲综合社区| 免费无码黄十八禁网站在线观看| 亚洲午夜一区二区电影院| 无码乱肉视频免费大全合集| 亚洲一区二区免费视频| 无码中文在线二区免费| 亚洲乱码国产乱码精华| 亚洲Aⅴ无码一区二区二三区软件| 午夜亚洲国产理论片二级港台二级| 国产男女猛烈无遮挡免费网站| 色欲aⅴ亚洲情无码AV蜜桃| 无码欧精品亚洲日韩一区夜夜嗨 | 国产亚洲真人做受在线观看| 精品视频一区二区三区免费| 亚洲视频在线观看一区| 国产啪精品视频网免费| 国产成人综合亚洲| 亚洲永久精品ww47| 99久久久国产精品免费无卡顿| 亚洲中文字幕久久精品无码VA| 亚洲福利精品电影在线观看| 很黄很污的网站免费| 国产成人亚洲精品| 亚洲区不卡顿区在线观看| 日韩免费无码一区二区三区| 亚洲AV无码无限在线观看不卡| 亚洲国产中文字幕在线观看 | 青青草国产免费国产是公开| 亚洲av中文无码乱人伦在线r▽| 国产va免费精品观看精品 | 亚洲综合日韩中文字幕v在线| 拍拍拍又黄又爽无挡视频免费|