last-modifyとIf-Maodifid-Sinceを利用してページキャッシュを行います.
httpでは Last-Maodifiedと If-Maodified-Sinceは、ページの最後の修正時間を記録するためのHTTPヘッダ情報であり、
なお、ここでのLast-Maodifiedは、サーバからクライアントに送信されるHTTPヘッダであり、
もう一つのIf-Maodified-Sinceは、クライアントからサーバに送信されるヘッダであり、
一体彼らはどうやって遊んでいますか?私のプロジェクトの一例を使って説明します.
ファンドの正味値は毎日更新されますので、プロジェクト起動時にデータベースで一度データを取って、このリストをキャッシュします.また、このリストのdateを保存して、タイマーを通して、ある時点でこのリストを更新します.
リストは毎日更新しているので、フロントエンドページから出力されるこのリストのデータも一日に一度変更されます.サーバーのストレスを軽減するために、ページがキャッシュされます.
個人理解の原理:
ローカルに存在するcacheページを再度要求すると、クライアントはIf-Maodified-Sinceヘッダを介して前のサーバから送信されます.
Last-Maodifiedは最終的にタイムスタンプを修正して送ります.これはサーバー側に検証させるために、このタイムスタンプでクライアントのページを判断するためです.
最新のものかどうかは、最新のものではない場合は、新しいコンテンツに戻り、最新の場合は、戻り304は、クライアントにローカルcacheのページを教える.
最新のものですので、クライアントは直接にローカルからページをロードすることができます.これにより、ネットワーク上で送信されるデータは大幅に減少し、サーバーの負担も軽減されます.
ソースを見ています
上のクラスは org.springframe ework.web.com ntxt.request.Servlet WebRequest
その後、controllerで呼び出します.
この方法はデータ更新の頻度が遅いので、リアルタイムのデータではだめです......
皆さん、足りないところを指摘してください.
なお、ここでのLast-Maodifiedは、サーバからクライアントに送信されるHTTPヘッダであり、
もう一つのIf-Maodified-Sinceは、クライアントからサーバに送信されるヘッダであり、
一体彼らはどうやって遊んでいますか?私のプロジェクトの一例を使って説明します.
ファンドの正味値は毎日更新されますので、プロジェクト起動時にデータベースで一度データを取って、このリストをキャッシュします.また、このリストのdateを保存して、タイマーを通して、ある時点でこのリストを更新します.
リストは毎日更新しているので、フロントエンドページから出力されるこのリストのデータも一日に一度変更されます.サーバーのストレスを軽減するために、ページがキャッシュされます.
個人理解の原理:
ローカルに存在するcacheページを再度要求すると、クライアントはIf-Maodified-Sinceヘッダを介して前のサーバから送信されます.
Last-Maodifiedは最終的にタイムスタンプを修正して送ります.これはサーバー側に検証させるために、このタイムスタンプでクライアントのページを判断するためです.
最新のものかどうかは、最新のものではない場合は、新しいコンテンツに戻り、最新の場合は、戻り304は、クライアントにローカルcacheのページを教える.
最新のものですので、クライアントは直接にローカルからページをロードすることができます.これにより、ネットワーク上で送信されるデータは大幅に減少し、サーバーの負担も軽減されます.
ソースを見ています
/**
*
* @param lastModifiedTimestamp list
* @return list
*/
public boolean checkNotModified(long lastModifiedTimestamp) {
if (lastModifiedTimestamp >= 0 && !this.notModified &&
(this.response == null || !this.response.containsHeader(HEADER_LAST_MODIFIED))) {
long ifModifiedSince = getRequest().getDateHeader(HEADER_IF_MODIFIED_SINCE);// if-modified
this.notModified = (ifModifiedSince >= (lastModifiedTimestamp / 1000 * 1000));
if (this.response != null) {
if (this.notModified) {//
this.response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); // 305
}
else {
this.response.setDateHeader(HEADER_LAST_MODIFIED, lastModifiedTimestamp); // Last-Modified
}
}
}
return this.notModified;
}
上のクラスは org.springframe ework.web.com ntxt.request.Servlet WebRequest
その後、controllerで呼び出します.
@RequestMapping(method = { RequestMethod.GET, RequestMethod.POST })
public HashMap getFundNavInfoList(WebRequest webRequest,HttpServletRequest request,FundNavInput in) throws Exception {
//check is modify true , , 304
if(webRequest.checkNotModified(lastModifyTime)){
return null;
}
//......... 。。。。
}
まとめ:この方法はデータ更新の頻度が遅いので、リアルタイムのデータではだめです......
皆さん、足りないところを指摘してください.