3

Jboss6サーバーのSpringJSFFacelets Webアプリケーションでは、セキュリティ上の理由から、特定のWebページがWebブラウザーによってキャッシュされないようにする必要があります。また、クロスブラウザとしても機能するはずです。FirefoxのYSlowプラグインでテストを実行したときに、以下の推奨事項を見つけました。

ここに画像の説明を入力してください

私のWebアプリケーションでは、キャッシュも無効にするようにPhaselistenerを設定しています。しかし、なぜこれらの結果がYSlowによって提供されるのか理解できませんでした。これらの静的コンポーネントに遠い将来の有効期限を設定してこの問題を解決し、このページのパフォーマンスも向上させる方法を知りたいです。

キャッシュ制御フェーズリスナー

public class CacheControlPhaseListener implements PhaseListener {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public PhaseId getPhaseId() {
        return PhaseId.RENDER_RESPONSE;
    }

    public void afterPhase(PhaseEvent event) {
    }

    public void beforePhase(PhaseEvent event) {
        FacesContext facesContext = event.getFacesContext();
        HttpServletResponse response = (HttpServletResponse) facesContext
                .getExternalContext().getResponse();
        response.addHeader("Pragma", "no-cache");
        response.addHeader("Cache-Control", "no-cache");
        response.addHeader("Cache-Control", "no-store");
        response.addHeader("Cache-Control", "must-revalidate");
        response.addHeader("Expires", "Mon, 8 Aug 2006 10:00:00 GMT");
    }
}

faceconfigで

<lifecycle>
    <phase-listener id="nocache">com.company.jsf.listener.CacheControlPhaseListener</phase-listener>
</lifecycle>

httpヘッダー

ここに画像の説明を入力してください

将来の日付を追加した後も、YSlowは次のように表示します。

ここに画像の説明を入力してください

4

1 に答える 1

4
response.addHeader("Expires", "Mon, 8 Aug 2006 10:00:00 GMT");

2006年8月8日は、今日の時点では間違いなく「遠い将来」の有効期限ではありません。

たとえば、今日から30日後など、実際の遠い将来の有効期限を設定する必要があります。

response.setDateHeader("Expires", System.currentTimeMillis() + (30 * 24 * 60 * 60 * 1000L));

参照:


具体的な問題とは関係なく、キャッシュコントロールとプラグマヘッダーは、これらのリソースをまったくキャッシュしないように指示します。これは意味がありません。それらを削除します。また、フィルターアプローチの代わりにフェーズリスナーアプローチを使用するのは不器用です。

于 2012-12-19T12:05:49.537 に答える