2011-10-30 3 views
0

私はいくつかのhtmlページを返す小さなサーブレットを持っています。これらのページの内容はかなり複雑ですが、1時間程度で変化します。しかし、それはユーザーによって頻繁に要求されます。私はそれぞれの要求でそれを再計算することを避けたい。キャッシュされたgzipのhtmlページをhttpサーブレットリクエストに戻すにはどうすればいいですか?

gzip-edバージョンをメモリ(バイト配列)に準備して、このページのすべてのHTMLリクエストへの応答として設定できるかどうか疑問に思っていました。私は毎時新しいgzip-ed版キャッシュを再計算します。

これが可能なら、どうすればよいですか?フィルターを使用すべきですか?この質問のために、すべてのブラウザがgzip-edレスポンスを処理できると仮定できます。私はコード例を探しています。

答えて

3

、これは解決策のようだ:

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サーバーは、そうするように構成されている場合、およびクライアントが要求に必要なヘッダーを提供する場合、データを自動的に圧縮します。つまり、ページを送信する前に圧縮する必要はありません。可能であれば、サーバーは自動的に圧縮します。

キャッシュするには、処理されたページをディスクやメモリにmemcacheなどを使用して保存できます。

たとえば、crontabなどのスクリプトを1時間ごとに生成し、生成されたページだけを提供するために、1時間ごとにページを更新する必要があることが分かっている場合は、crontabを使用してスクリプトを実行できます。これは、サーバー側でのキャッシュまでは特別な考慮を必要としないので、かなり単純です。

一方、キャッシュされたバージョンや新しいものを使用するかどうかを判断する前にページが古くなっていないかどうかを確認する必要がある場合は、もう少し複雑になります。たとえば、データが古くなっているかどうかをチェックするのは、ページを生成するのと同じくらいコストがかかる可能性があります。

詳細な説明がなくても、より具体的な回答は得られません。かなりいくつかのグーグル後

+0

バイト配列のページの圧縮バージョンがあると仮定して、http応答にどのように入れますか?私は毎回ページを圧縮したくありません。私はWebサーバーではなく、Tomcatを扱っています。 – JVerstry

+0

まあTomcatはウェブサーバです。私は自分自身に慣れていませんが、標準のJavaサーブレットを使用すると仮定すると、HttpServletResponse.addHeader()を使用して必要なヘッダを設定し、HttpServletResponse.getWriter ).print()。 – Nico

2

なぜそれを苦労してやって?

オープンTomcatの/conf/server.xml、あなたのHTTPポートの<Connector>をルックアップし、新しい属性を追加するには、以下のように編集します。クライアントがそれをサポートしているとき

<Connector ... compression="on"> 

Tomcatが、その後GZIPすべての応答が自動的にcompressableMimeTypeに一致しますが。他のすべての自尊心のウェブサーバは、同様の設定をしています。

+1

しかし、毎回Tomcatがそれぞれの回答を再圧縮しますか? (私はまだ学習中です) – JVerstry

+0

はい、そうですが、それは本当に心配するものではありません。 GZIPは特に高速で安価です。あなたのウェブサーバは、他のCPU集中型のクランチングジョブを何もしていませんか?適切な応答キャッシュヘッダー(期限切れ、最後に変更された、etag)をフィルターで設定して、ブラウザーが決まった時間だけキャッシュ内のページを保持できるようにする方がよいでしょう。 – BalusC

+0

私は完全に適切なキャッシュヘッダーに同意します。実際、比較的静的なページ用に超高速サーブレットを作成するために余分なマイルを用意する準備が整いました。私は両方を使用する予定です。あなたのフィードバックに多くの感謝。 – JVerstry