2

ほとんどの場合 (主に FireFox で) onModuleLoad イベントで行われたリクエストがキャッシュされないという問題に直面しました。FireBug でネットワーク コンソールを確認したところ、ほとんどの場合、このような種類のリクエストがキャッシュからではなくサーバーからフェッチされていることが示されています。

テスト ケースを用意しました。http://tradeosam.appspot.com/で確認できます。

onModuleLoad の実装は次のとおりです。

public void onModuleLoad() {
    RequestBuilder request = new RequestBuilder(RequestBuilder.GET,
            "query/test?v=1-8951245");
    try {
        request.sendRequest(null, new RequestCallback() {

            @Override
            public void onResponseReceived(Request request,
                    Response response) {
            }

            @Override
            public void onError(Request request, Throwable exception) {
            }
        });
    } catch (RequestException e) {
    }

    new Timer() {

        @Override
        public void run() {
            RequestBuilder request = new RequestBuilder(RequestBuilder.GET,
                    "query/test?v=1-23478.34");
            try {
                request.sendRequest(null, new RequestCallback() {

                    @Override
                    public void onResponseReceived(Request request,
                            Response response) {
                    }

                    @Override
                    public void onError(Request request, Throwable exception) {
                    }
                });
            } catch (RequestException e) {
            }
        }
    }.schedule(1000);
}

コードからわかるように、onModuleLoad の 2 つのリクエストを実行します。最初のリクエストは直接実行され、ブラウザによってキャッシュされることはほとんどありません。2 つ目は 1 秒後にタイマーで実行され、問題なくキャッシュされます。これらのリクエストは両方とも同じヘッダーを持ち、同じサーブレットに送信されます。唯一の違いは、2 つを区別するために使用される「v」パラメータです。

4

1 に答える 1

0

現在、ショーケースに「クエリ/テスト」リクエストは表示されませんが、表示されるすべての XHR リクエストには、ブラウザーのキャッシュ命令がありません。デフォルトでは、ブラウザは XHR リクエストをキャッシュしません。b/c ルールとして、そのようなリクエストは最新のデータをもたらす必要があります。ただし、ブラウザーに強制的にキャッシュさせたい場合は、クライアント側の要求ヘッダーに Cache-Control を追加するだけです。要件がわからないため、具体的なルールを指定することはできません-少なくともデータを保持する期間。

RFC: " Caching in HTTP " および http キャッシングに関する記事: " Caching Tutorial " を参照してください。

お役に立てれば。

于 2013-06-08T20:14:37.817 に答える