4

Web ページの .png ファイルをキャッシュしたい。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>

init() で次の方法で 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() は次のとおりです。

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); 
    }
}

私の問題は、ブラウザーで Web ページを更新するたびに、クライアントが .png ファイルを要求し続けることです。私のフィルターが機能していないと思います。この構成は正しいですか?

4

2 に答える 2

2

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

response.setDateHeaderを の前に移動するfilChain.doFilterと、ヘッダーが送信されます。

そうは言っても、これは正しく理解するのが難しいことで有名です。ブラウザーは、HTTP キャッシュに対してあらゆる種類の異なる動作を持っており、適切なヘッダーであると思われるものを送信しても、探している効果が常に得られるとは限りません。

HTTP ヘッダー スニッフィング ツール (Firefox 用の優れた " Live HTTP Headers " プラグインなど) を使用して、実際に何が行われているかを確認してみてください。

于 2011-03-10T10:27:24.860 に答える
2

「有効期限」の日付は 1 年以上先にしないでください。http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.htmlのセクション 14.21 の有効期限を参照してください。

応答を「無期限」としてマークするために、オリジン サーバーは、応答が送信されてから約 1 年の有効期限を送信します。HTTP/1.1 サーバーは、1 年以上先の Expires 日付を送信すべきではありません。

于 2011-03-10T10:28:14.280 に答える