2013-10-11 6 views
10

フロントエンドではGETリクエストにAngularJS "$ resource"を使用し、バックエンドではSpringMVCを使用してメソッドを公開しています。JavascriptによるキャッシュとサーバーのHTTPResponseヘッダーの設定との違いは何ですか?

私のGETリクエストをキャッシュします。 $ cacheFactoryのようにいくつかの方法があることに気付きました。か何かのように:

return { 
    Things: $resource('url/to/:thing', {}, { 
    list : { 
    method : 'GET', 
    cache : true 
    } 
}; 

これはまた、いくつかのキャッシュパラメータを持つ単純なAJAX呼び出し可能とangularJSを使用してnecessarlyことができなかったことに注意してください。このようなアプローチを使用して

ので、代わりのクライアントには、私はこのようないくつかのことをヘッダそれだけでレスポンスにキャッシュを設定するJava単にすることにより、サーバ上で行うことができるだろう。

response.setHeader("Cache-Control: max-age=2592000"); 

何これら2つのアプローチの違いは何ですか?どのアプローチを使うべきですか?

P.この質問は、サーバー側のキャッシュとクライアント側のキャッシュに関する質問ではなく、サーバーのHTTPResponseヘッダーを設定するだけです。

答えて

9

私はあなたが2つの異なるレイヤーでキャッシュすることを指していると信じています。

角度のキャッシュ($cacheFactoryを参照)は、メモリ内のJavascriptキャッシュです。キャッシュは、データをJavascriptオブジェクトに格納します。あなたはクライアント上でそれらを何らかの形で管理しています。ローカルストレージに保存するカスタムキャッシュを実装しないかぎり、別のWebページに移動したり更新したりするとキャッシュが失われるため、キャッシュは保持されません。

応答のパラメータCache-Controlがブラウザのキャッシュを制御します。 Javascriptからこのキャッシュを直接操作することはできません。しかし、キャッシュヘッダーを適切に設定すると、セッション間でデータが保持されます。また、複数のクライアントにサービスを提供している中間プロキシに、要求をキャッシュできるかどうかを知らせることで、Javascriptキャッシュよりも多くのトラフィックを削減できます。

どのアプローチを使用するべきかについては、一般にブラウザキャッシュに依存していると言えますが、これははるかに低いレベルであり、セッション全体で持続するからです。クライアント側でのみ合理的に取得できるキャッシュをより詳細に制御する必要がある場合は、Javascriptキャッシュを使用します。あるいは、両方を有効にして両方の利点を得ることができ、余分なコードのメンテナンス/複雑さに耐えることができます。

+0

ありがとう!例で私は3つの異なったパラメタがキャッシュに必要とされないのを見ます:Pragma + Cache-Control + Expires。キャッシュについては、これらの3つが必要ですか、またはキャッシュ制御が必要ですか?私は "Pragma:cache"というヘッダを見なかったので – Spring

+0

私は貧弱な例(削除済み)を作った。私は主に、 'Cache-Control'がどのように機能するか、あるいはあなたが驚くべき振る舞いをする可能性があることを深く考えなければならないことを指摘したいと思っていました。しかし、はい、キャッシュコントロールはそれ自身で動作します。この記事は有用な参照のようですhttp://www.mnot.net/cache_docs/#CACHE-CONTROL – Yunchi

+1

私たちは、特定のページの様々なxhrロードされたウィジェットにCache-Controlを5分間使用します。つまり、ページに戻ってもXHRはJavaScriptによって実行されますが、ブラウザ自体がキャッシュされたクエリをすぐに返すことになります(もちろんクエリが同一である限り)。情報がスーパーカレントである必要がない特定のページのサーバー負荷を軽減するための非常に迅速な方法として機能するので、私はこの方法が好きです。 –

関連する問題