15

Google ( https://developers.google.com/speed/docs/best-practices/caching )が推奨する静的リソースを適切にキャッシュするフィルターを作成するにはどうすればよいですか。

最終更新日を静的な日付に設定するフィルタを作成するだけで十分ですか (これはサーバーが再起動するたびに変更されます)。

すべてのキャッシュ可能なリソースに対して、Expires または Cache-Control max-age のいずれか、および Last-Modified または ETag のいずれかを指定することが重要です。Expires と Cache-Control: max-age の両方を指定するか、Last-Modified と ETag の両方を指定するのは冗長です。

上記のリンクは、Expires または Cache-Control を指定する必要があることを示唆しているようです。なぜそれが必要なのですか?

4

3 に答える 3

27

Google が推奨する静的リソースを適切にキャッシュするフィルターを作成するにはどうすればよいですか

/resourcesJSFリソースで、 JSF組み込みリソースハンドラーによって完全に処理されるフォルダー内のファイルを意味する場合(したがってプレーンHTMLの方法ではなく、、、、を介しすべて参照される<h:outputStylesheet><h:outputScript><h:graphicImage>#{resource})、フィルターを自作する必要はありません仕事。Google の推奨事項を満たすために必要な唯一のことは、Expires日付をもう少し先に設定することです。つまり、デフォルトは 7 日 (604800000 ミリ秒) ですが、Google Page Speed や Yahoo YSlow などのパフォーマンス テスト ツールは、最低でも 30 日 (2592000000 ミリ秒) を推奨しています。

Mojarra では、次のコンテキスト パラメータを使用して設定できますweb.xml

<context-param>
    <param-name>com.sun.faces.defaultResourceMaxAge</param-name>
    <param-value>2592000000</param-value> <!-- 30 days -->  
</context-param>

そして MyFaces では次のようになります:

<context-param>
    <param-name>org.apache.myfaces.RESOURCE_MAX_TIME_EXPIRES</param-name>
    <param-value>2592000000</param-value> <!-- 30 days -->  
</context-param>

最終更新日を静的な日付に設定するフィルタを作成するだけで十分ですか (これはサーバーが再起動するたびに変更されます)。

を設定する必要はありませんLast-Modified。JSF リソース ハンドラは、すでにそれを自動的に行っています。リソースを変更したためにリソースを強制的に再読み込みする場合は、リソース ライブラリのバージョン管理を使用します。「 JSF リソース ライブラリの目的と使用方法」も参照してください。

サーバーが再起動するたびに変更しても意味がないことに注意してください。Expiresヘッダーは、一定期間後にのみキャッシュの有効性を再テストするようブラウザに指示し続けるためです。ブラウザーが実際にリソースを要求するまで、ブラウザーはリソースの変更に気付くことはありませんLast-Modified。ブラウザーがリソースを完全に再要求するのを困難にする唯一のことは、URL の変更です。通常、変更されたクエリ文字列パラメーター値によって実現されます。JSF リソース ライブラリのバージョン管理はまさにそれを行います。

また、OmniFacesCombinedResourceHandlerは、リソース ライブラリのバージョンではなく、リソースの最終更新日時のタイムスタンプをクエリ文字列の「リソース バージョン」として使用することに注意してください。したがって、それを使用している場合、リソース ライブラリのバージョン管理メカニズムは必ずしも必要ではありません。


上記のリンクは、Expires または Cache-Control を指定する必要があることを示唆しているようです。なぜそれが必要なのですか?

ヘッダーはExpires、条件付き GET 要求によってキャッシュされたリソースの有効性をいつ再テストするかをブラウザーに通知します。したがって、それまでブラウザはそれを行わず、キャッシュ内のものを使用し続けます。はCache-Control、使用するキャッシュ戦略をブラウザに伝えます。no-cacheの代わりにeg に設定されている場合publicExpiresヘッダーは効果がないことに注意してください。Cache-Controlまた、ヘッダーがないことはpublic(JSF リソースによって行われるように)暗示されることにも注意してください。

于 2013-02-25T12:05:35.317 に答える
5

これがキャッシュフィルターの書き方です。魅力のように機能します。

JSF/サーブレット画面の静的コンテンツのパフォーマンスを向上させるためのキャッシュ フィルターの作成

web.xml に以下を追加します

<filter>
    <filter-name>cache</filter-name>
    <filter-class>au.com.webapp.config.CacheFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>cache</filter-name>
    <url-pattern>*.xhtml</url-pattern>
</filter-mapping>

au.com.webapp.config パッケージで、次のようにクラス CacheFilter を作成します。

package au.com.webapp.config;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CacheFilter implements Filter {
    private static long maxAge = 86400 * 30; // 30 days in seconds

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        String uri = ((HttpServletRequest) request).getRequestURI();
        if (uri.contains(".js") || uri.contains(".css") || uri.contains(".svg") || uri.contains(".gif")
                || uri.contains(".woff") || uri.contains(".png")) {
            httpResponse.setHeader("Cache-Control", "max-age=" + maxAge);
        }
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("Cache Filter started: ");

    }

    @Override
    public void destroy() {
    }
}

画面がキャッシュを使用しているかどうかを確認する方法

コンテンツが既に gzip とキャッシュを使用しているかどうかを確認するには、Google Chromeブラウザで -> 画面を右クリック -> 検査 -> ネットワーク タブをクリック -> 画面を更新します。画像、アイコン、スタイルシートをクリックして、応答ヘッダーに次のように表示されるかどうかを確認します

Cache-Control:max-age=2592000

また、ページを更新したときに、要素のステータスが 200 (キャッシュから取得) ではなく 304 の場合は、完了です。

gzip などのその他のパフォーマンスの改善

gzip や JQuery UI コンポーネントなど、Web アプリケーションまたは Web サイトのパフォーマンスを大幅に変更できる追加の単純なパフォーマンス改善については、次のリンクを参照してください。 https://stackoverflow.com/a/35567464/5076414

于 2016-02-23T02:10:23.797 に答える
-1

フィルターを記述する必要はありません。Tomcat 7 には、リソースに Cache-Control を追加する ExpiryFilter が既に含まれています。これは、変更時間またはアクセス時間に基づく場合があります。このブログを参照してください:

http://kahimyang.info/kauswagan/howto_blogs/1574-improving_page_load_with_mod_expires_and_expiresfilter_in_jsf_applications

于 2013-06-24T16:40:42.197 に答える