2011-03-10 18 views
4

私のWebページの.pngファイルをキャッシュします。response.setDateHeader() - キャッシュが機能しない

public void doFilter(ServletRequest req, ServletResponse res, 
     FilterChain filChain) throws IOException, ServletException { 
    logger.debug("doFilter()"); 
    logger.info(((HttpServletRequest)req).getRequestURL().toString()); 
    filChain.doFilter(req, res); 
    if (res instanceof HttpServletResponse) { 
     HttpServletResponse response = (HttpServletResponse) res; 
     logger.info(((HttpServletRequest)req).getRequestURL().toString()); 
     response.setDateHeader("Expires", expiryDate); 
    } 
} 

私の問題:私はある)

String expiryDateStr = filterConfig.getInitParameter("expiryDate"); 
    SimpleDateFormat format = new SimpleDateFormat(
      "EEE, d MMM yyyy HH:mm:ss Z"); 
    try { 
     Date d = format.parse(expiryDateStr); 
     expiryDate = d.getTime(); 
    } catch (ParseException e) { 
     logger.error(e.getMessage(), e); 
    } 

のdoFilter()(INITで次のようにexpiryDateフィールドの値を設定

web.xmlに
<filter> 
    <filter-name>ContentFilter</filter-name> 
    <filter-class>filters.ContentFilter</filter-class> 
    <init-param> 
     <description>Add an Expires Header</description> 
     <param-name>expiryDate</param-name> 
     <param-value>Fri, 30 Apr 2021 20:00:00 GMT</param-value> 
    </init-param> 
    </filter> 
<filter-mapping> 
    <filter-name>ContentFilter</filter-name> 
    <url-pattern>*.png</url-pattern> 
</filter-mapping> 

を次のエントリを追加しましたブラウザでWebページを更新するたびに、クライアントは.pngファイルを要求し続けます。私のフィルタは動作していないと思う。この設定は正しいですか?

答えて

2

あなたのコードを見ると、の後に応答ヘッダーを設定している可能性があります。要求はサーブレットによって処理されています。その時点でヘッダーを追加するのは遅すぎます。応答データは既に送信されています。

filChain.doFilterの前に移動し、ヘッダーを送信する必要があります。

このことがあって、このことは正しく理解するのは難しいことです。ブラウザには、HTTPキャッシュのためのすべての種類の動作があり、正しいヘッダがあなたが探している効果を常に持っているとは限りません。

実際に何が起こっているかを実際に確認するには、HTTPヘッダースニッフィングツール(「Live HTTP Headers」という優れたプラグインのようなもの)を使用してみてください。

+0

私はdoFilter()の上にresponse.setDateHeaderを移動し、Live HTTPヘッダープラグインをインストールしました。私はpngファイルがweb.xmlで設定された値に設定された有効期限付きで返されるのを見ることができました。しかし、私がリフレッシュするとき、クライアントは依然としてそれらのファイルを要求していますか? expiresオプション以外のこのキャッシュを強制する標準的な方法はありますか? – ihavprobs

+0

@shk:生のサーブレットAPIで自分自身で解決しようとするのではなく、適切なWebフレームワークを使用する必要があります。 – skaffman

+0

ありがとうございます。私はそれを確認します。 – ihavprobs

2

「有効期限」の日付は、今後1年以内としてください。 節を参照してください14.21は、オリジンサーバ 「無期限にする」と回答をマークするにhttp://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

で期限切れ応答が送信された時点 から日付 約1年期限送信します。 HTTP/1.1サーバ は、今後1年よりも有効期限を に送信してはならない(SHOULD NOT)。

+0

私は1年未満に変更されました。それでも、ログでこのフィルタクラスに要求が送信されているのがわかりました。 – ihavprobs

関連する問題