Spring 3 MVC学習ノート3キャッシュ

7002 ワード


強制リクエストメソッドタイプpostまたはget:
 
<!—  chapter4-servlet.xml -->
<bean name="/helloWithPOST" class="cn.javass.chapter4.web.controller.HelloWorldController">
<property name="supportedMethods" value="POST"></property>
</bean>

 
name="/helloWithPOST"
以上の構成はPOST要求のみをサポートすることを示しており、GET要求クライアントであれば「HTTP Status 405-Request method'GET'not」を受信する
supported”
 
 
 
現在のリクエストのセッションの事前条件チェック.現在のリクエストにセッションがない場合、HttpSessionRequiredException例外が放出されます.
 
<!—  chapter4-servlet.xml -->
<bean name="/helloRequireSession"
class="cn.javass.chapter4.web.controller.HelloWorldController">
<property name="requireSession" value="true"/>
</bean>

 
name="/helloRequireSession"
このコントローラに入るときは、必ずセッションが存在しなければなりません.そうしないと、HttpSessionRequiredException異常が放出されます.
 
 
 
クライアント側キャッシュ制御:
1、キャッシュ5秒、cacheSeconds=5
 
 
package cn.javass.chapter4.web.controller;
// import
public class HelloWorldCacheController extends AbstractController {
	@Override
	protected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		// 
		resp.getWriter().write("<a href=''>this</a>");
		return null;
	}
}
 
 
 
<!—  chapter4-servlet.xml -->
<bean name="/helloCache"
class="cn.javass.chapter4.web.controller.HelloWorldCacheController">
<property name="cacheSeconds" value="5"/>
</bean>
 
 
 
chromeブラウザのデバッグツールを開きます.
サーバが返す応答ヘッダ:
「Expires:Wed,14 Mar 2012 09:38:32 GMT」と「Cache-Control:max-age=5」が追加されました.
「this」リンクは反応しませんでした
また、サーバもリクエストを受け取っていません.5秒後、「this」リンクをクリックすると、サーバに新しいデータのダウンロードを再リクエストすることがわかります.
 
注意:キャッシュ制御に関するいくつかの特殊な状況について説明します.
1、一般的なページジャンプ(ハイパーリンククリックジャンプ、js呼び出しwindow.openで新しいページを開く場合はブラウザキャッシュを使用します.
期限が切れていない場合はブラウザキャッシュのコピーを直接使用し、期限が切れていない場合は一度も要求を送信しません).
2、更新ページに対して(例えばF 5キーを押して更新する)、もう一度サーバーに要求を送信する.
 
 
 
2、キャッシュしない、cacheSeconds=0

class="cn.javass.chapter4.web.controller.HelloWorldCacheController">


以上の構成では、ブラウザがサーバに最新のデータのダウンロードを要求するたびに
 
 
3、cacheSeconds<0、データを追加しない
応答ヘッダにはキャッシュ制御情報は一切付加されません.
 
4、Last-Modifiedキャッシュメカニズム
(1、クライアントがurlを初めて入力すると、サーバ側はコンテンツとステータスコード200を返して要求が成功してコンテンツを返し、同時に1つ追加する
「Last-Modified」の応答ヘッダは、「Last-Modified:Wed,14 Mar 2012 10:22:42 GMT」のように、このファイルのサーバ上での最終更新時間を示します.
最終更新時間は(2012-03-14 10:22)であることを示す.
(2、クライアントがこのURLを2回目に要求すると、クライアントはサーバに要求ヘッダ「If-MOdified-Since」を送信し、サーバにその時間以降の現在の時刻を問い合わせる
「If-Modified-Since:Wed,14 Mar 2012 10:22:42 GMT」など、リクエスト内容が変更されたかどうかは、サーバ側の内容に変化がなければ、
HTTP 304ステータスコードが自動的に返される(応答ヘッダが空であれば、ネットワーク帯域幅が節約される).
 
 
クライアント強制キャッシュの有効期限:
(1、ctrl+F 5で強制リフレッシュ可能(リクエストヘッダHTTP 1.0 Pragma:no-cacheとHTTP 1.1 Cache-Control:no-cacheが追加され、
If-MOdified-Sinceリクエストヘッダが削除された)は、サーバコンテンツをキャッシュしないで強制的に取得することを意味する.
(2、リクエストしたurlの後にタイムスタンプを付けてコンテンツを再取得し、タイムスタンプを付けるとブラウザは同じコンテンツではないと判断します.
http://sishuok.com/?2343243243およびhttp://sishuok.com/?343343442回の違うリクエスト
 
 
Springは、Last-Modifiedメカニズムのサポートも提供しています.LastModifiedインタフェースを実装するだけです.
 
 
package cn.javass.chapter4.web.controller;
public class HelloWorldLastModifiedCacheController extends AbstractController implements LastModified {
	private long lastModified;
	protected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		// 
		resp.getWriter().write("<a href=''>this</a>");
		return null;
	}

	public long getLastModified(HttpServletRequest request) {
		if(lastModified == 0L) {
			//TODO  : , 
			lastModified = System.currentTimeMillis();
		}
		return lastModified;
	}
}
 
 
 
<!—  chapter4-servlet.xml -->
<bean name="/helloLastModified"
class="cn.javass.chapter4.web.controller.HelloWorldLastModifiedCacheController"/>
 
 
(1、サーバへの要求の送信、例えば(http://localhost:8080/springmvc/helloLastModified)を選択すると、サーバは200の応答を返します.
(2、再度F 5を押してクライアントをリフレッシュし、ステータスコード304に戻ってサーバが更新していないことを示す:
(3、サーバーを再起動し、再度リフレッシュすると、200ステータスコードが表示されます(サーバーのlastModified時間が変わったため).
 
Springは、要求された「If-Modified-Since」が現在のgetLastModifiedメソッドと等しい時間よりも大きいコードで期限切れかどうかを判断する
スタンプは、変更されていないとみなされます.
this.notModified = (ifModifiedSince >= (lastModifiedTimestamp/1000 * 1000));
 
5、ETag(実体マーク)キャッシュメカニズム
(1:ブラウザは初めて要求して、サーバーは応答する時に要求URLにタグを付けて、そしてHTTPの応答の頭の中でそれをクライアントに伝達して、サーバーの端のようです
返されるフォーマット:"ETag:"0 f 8 b 0 c 86 fe 2 c 0 c 7 a 67791 e 53 d 660208 e 3"
(2:ブラウザの2回目のリクエスト、クライアントのクエリー更新フォーマットは、「If-None-Martch:『0 f 8 b 0 c 86 fe 2 c 0 c 7 a 67791 e 53 d 660208 e 3』」、
ETagが変更されておらず、コンテンツが変更されていないことを示す場合、ステータス304に戻る.
 
SpringはETagのサポートも提供しており、具体的にはweb.xmlでフィルタを構成するには:

etagFilter
org.springframework.web.filter.ShallowEtagHeaderFilter


etagFilter
chapter4

 
分析:
1):要求をサーバーに送信します.http://localhost:9080/springmvc-chapter 4/hello、サーバが返す応答ヘッダに追加
(ETag:「0 f 8 b 0 c 86 fe 2 c 0 c 7 a 67791 e 53 d 660208 e 3」):
2):ブラウザがサーバに要求を再送信し(F 5でリフレッシュ)、要求ヘッダに「If-None-Match:
「0 f 8 b 0 c 86 fe 2 c 0 c 7 a 67791 e 53 d 660208 e 3」は、サーバが変更されていないことを示す304コードを返し、応答ヘッダが再び追加されたことを示す
「ETag:『0 f 8 b 0 c 86 fe 2 c 0 c 7 a 67791 e 53 d 660208 e 3』(毎回計算が必要):
 
では、サーバー側はどのようにETagを計算しますか?
protected String generateETagHeaderValue(byte[] bytes) {
StringBuilder builder = new StringBuilder("\"0");
DigestUtils.appendMd5DigestAsHex(bytes, builder);
builder.append('"');
return builder.toString();
}
bytesはresponseがクライアントに書き込む応答体(すなわち応答するコンテンツデータ)であり、MD 5アルゴリズムによって計算されるコンテンツの要約情報である.つまり、サーバの内容が変更されなければ、ETagは毎回同じであり、サーバ側の内容は変更されない.
 
 
ここではキャッシュ制御の一部のみを列挙し、本書の範囲を超えて詳しく説明し、強く推奨します.http://www.mnot.net/cache_docs/(中国語版
http://www.chedong.com/tech/cache_docs.html)HTTPキャッシュ制御となぜキャッシュするのかを詳しく知る.
キャッシュの目的は、css、js、ピクチャなどの静的リソースをキャッシュすべき、対応する遅延を低減し、ネットワーク帯域幅の消費を低減することである.
実際のプロジェクトでは、nginx、apacheなどの逆プロキシサーバを使用してキャッシュされます.