2011-10-30 57 views
0

我有一個小的servlet返回幾個html頁面。其中一頁的內容非常複雜,但每隔一小時左右就會更改一次。但是,它經常被用戶請求。我想避免在每次請求時重新計算它。如何將緩存的gzipped html頁面返回給http servlet請求?

我想知道是否有可能在存儲器(字節陣列)準備一個gzip-ED版本,並且將其設置爲響應於針對當前頁的所有HTML請求。我還會每小時重新計算一次新的緩存gzip-ed版本。

如果這是可能的,我該怎麼做?我應該使用過濾器嗎?爲了這個問題,我們可以假設所有瀏覽器都可以處理gzip-ed響應。我正在尋找一個代碼示例。

回答

3

頗有些google搜索後,這似乎是解決辦法:

public class MyFilter implements Filter { 

    private byte[] my_gzipped_page = .... 

    public void doFilter(ServletRequest req, ServletResponse res, 
     FilterChain chain) throws IOException, ServletException { 

     if (req instanceof HttpServletRequest) { 

      HttpServletRequest request = (HttpServletRequest) req; 
      HttpServletResponse response = (HttpServletResponse) res; 

      String ae = request.getHeader("accept-encoding"); 

      if (ae != null && ae.indexOf("gzip") != -1) { 

       response.addHeader("Content-Length", 
        Integer.toString(my_gzipped_page.length)); 
       response.addHeader("Content-Encoding", "gzip"); 

       OutputStream output = response.getOutputStream(); 
       output.write(my_gzipped_page); 
       output.flush(); 
       output.close(); 

       return; 

      } else ... 

     } 
    } 
    ... 
} 
0

這不是真的從你的問題清楚,但我猜你正在尋找的信息如何緩存數據,而不是如何提供壓縮數據。大多數Web服務器會自動壓縮數據(如果配置爲這樣),並且客戶端在請求中提供必要的標頭。換句話說,在傳輸它之前,您不需要壓縮頁面,服務器會盡可能自動壓縮頁面。

緩存,您可以使用例如內存緩存磁盤上或存儲在內存中的頁面的處理後的版本。

如果你知道你只需要更新的頁面,比如每隔一小時,你可以用crontab中運行腳本,例如,生成頁面每隔一小時,只是服務生成的頁面。這應該是相當直接的,因爲就服務器端的緩存而言,您並不需要特別考慮。

在另一方面,如果需要檢查,如果該頁面是決定羯羊使用緩存的版本或新的人之前陳舊,它變得有點複雜。例如,檢查數據是否過時幾乎與生成頁面一樣昂貴。

如果沒有更多細節,無法給出更具體的答案。

+0

假設我有一個字節數組中的頁面的壓縮版本,我怎麼把它放在http響應中?我不想每次壓縮頁面。我正在處理Tomcat,而不是Web服務器。 – JVerstry

+0

那麼Tomcat是一個Web服務器...我不熟悉它自己,但假設它使用了標準的Java servlet的,你應該能夠使用HttpServletResponse.addHeader()來設置必要的標頭,然後發送字節數組HttpServletResponse.getWriter( )。打印()。 – Nico

2

爲什麼做了艱辛的道路?

打開Tomcat的/conf/server.xml,查找該<Connector>您的HTTP端口,如下添加新的屬性編輯:

<Connector ... compression="on"> 

Tomcat會再GZIP匹配compressableMimeType自動地在客戶端支持它的所有響應。所有其他自我推崇的網絡服務器都有類似的配置設置。

+1

但是,將tomcat每次重新壓縮每個答案? (我仍然在學習曲線) – JVerstry

+0

是的,它會的,但這不是真正需要擔心的事情。 GZIP特別快速且便宜。您的網絡服務器不執行一些其他的CPU密集型工作?您最好使用過濾器設置適當的響應緩存標頭(過期,上次修改和etag),以便瀏覽器將頁面保留在緩存中一段確定的時間。 – BalusC

+0

我完全同意適當的緩存標題。事實上,我已經準備好多出幾英里來爲相對靜態的頁面創建一個超快速的servlet。我打算使用兩者。非常感謝您的反饋。 – JVerstry