- PR -

HTMLコンテンツをキャッシュさせたい

投稿者投稿内容
みーむ
ベテラン
会議室デビュー日: 2003/10/13
投稿数: 56
投稿日時: 2003-11-21 12:16
新参者です。御世話になります。

5分おきに更新されるHTMLのコンテンツをJSPで
出力しているのですが、中継される任意のプロキシサーバにて
5分間データが保持されるようしたいのです。
サーブレットから、HTMLヘッダを変更して、
上記の仕様を実現したいと考えています。
現在、HttpServletResponseインスタンスに対して
以下のような指定をしているのですが、うまく行きません。
よろしければ、アドバイス頂けないでしょうか?

setHeader("Cache-Control","public")
setHeader("Expires","有効期限")
有効期限はTimeZoneをGMTで、
SimpleDateFormat("E dd MMM yyyy hh:mm:ss zzz",Locale.US)
にて、5分後の時間を指定しています。

よろしく、御願いします。
Gordie
ベテラン
会議室デビュー日: 2003/10/14
投稿数: 64
投稿日時: 2003-11-21 13:23
Gordieです。こんにちは。

うまくキャッシュされない原因は、返された日付値をプロキシが認識できていないか、キャッシュを行わないようにプロキシが設定されているか、プロキシのキャッシュ容量が少ないか、だと思います。

そこで1点気になったのが、
引用:

setHeader("Expires","有効期限")
有効期限はTimeZoneをGMTで、
SimpleDateFormat("E dd MMM yyyy hh:mm:ss zzz",Locale.US)


なんですが、ここで指定すべき日付形式は曜日の後にカンマが入るはずなんです。
そこを修正して試してみるか、setHeaderではなくsetDateHeaderを使ってみるか。
みーむ
ベテラン
会議室デビュー日: 2003/10/13
投稿数: 56
投稿日時: 2003-11-21 15:30
Gordieさん、早速のアドバイス、本当に有り難うございます。

>ここで指定すべき日付形式は曜日の後にカンマが入るはずなんです。
>そこを修正して試してみるか、setHeaderではなくsetDateHeaderを使ってみるか。

さっそく、試してみましたが、うまくキャッシュ出来ませんでした。
Gordieさんが、おっしゃるように、テストに用いたプロキシサーバの設定
によるのかも知れません。

そこで、簡易的にキャッシュが効いているのかを試すために、
Cache-Controlをprivateに指定してみたのですが、
ブラウザ側でもキャッシュは効いていないようです。
サーブレットから指定するhttpヘッダーに問題があるのでしょうか?
ちなみに、httpヘッダーのExpiresは他のソースからは指定しておりません。

キャッシュを利用したプログラミングに全く慣れていないもので、
基本的な事を、尋ねてしまい申し訳なく思っています。
どうか、皆様よろしく御願いします。
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2003-11-21 15:41
ども、ほむらです。
JSPでキャッシュが利くという事実におどろきですが。。
出力したHTML側の'Last-Modified'はどうなっていますか?

ページの更新があったということでキャッシュを使用していないだけとか?

ためしに、出力するHTMLに
<script>
alert( '更新日時:' + document.lastModified );
</script>
というのをつけて確認してみてはどうでしょうか?
みーむ
ベテラン
会議室デビュー日: 2003/10/13
投稿数: 56
投稿日時: 2003-11-21 16:03
ほむらさん、有り難うございます。

現在、サーブレット側からは'Last-Modified'の指定はしていません。

引用:

ためしに、出力するHTMLに
<script>
alert( '更新日時:' + document.lastModified );
</script>
というのをつけて確認してみてはどうでしょうか?



教えていただいた方法で、表示してみたところ、
アクセス毎に作成日は変わっており、うまくキャッシュできていない
ことが再確認できました。
今はテスト用に有効期限を30秒で10秒間隔程度でアクセスしています。

>JSPでキャッシュが利くという事実におどろきですが。。
これって、無理なんでしょうか?
Getメソッドでリクエストすれば、可能かな?って思っていたのですが...

なにとぞ、よろしく御願いします。
Gordie
ベテラン
会議室デビュー日: 2003/10/14
投稿数: 64
投稿日時: 2003-11-21 16:18
Gordieです。

JSPでもキャッシュは利きますよ。動的に生成されたものであれ静的なものであれ、返す応答に違いはありませんから。
Expiresを指定された場合は、指定された有効期限を過ぎるまでは要求自体を出さないので、ページが更新されたかどうかに関係なくキャッシュを使用します。

あ、ただし「リロード」ボタンを押したらだめですよ
試すときは他のページに遷移してからもとのページに戻ってくるようにしましょう。
ただし「戻る」ボタンは使わないこと。

サーバからの生の応答を見ながら作業すると作業がかなりやりやすいかと。
みーむ
ベテラン
会議室デビュー日: 2003/10/13
投稿数: 56
投稿日時: 2003-11-21 16:28
Gordieさん、引き続きアドバイス頂き感謝しています。

METAタグのrefreshを使ってテストしています。

>あ、ただし「リロード」ボタンを押したらだめですよ
>試すときは他のページに遷移してからもとのページに戻ってくるようにしましょう。
>ただし「戻る」ボタンは使わないこと。
通常のGetメソッドでのリクエストでも、うまくいかないので、
ブラウザのキャッシュも効いていないみたいです。

>サーバからの生の応答を見ながら作業すると作業がかなりやりやすいかと。
サーバはtelnetが使用不可なのですが、
生のヘッダーを見るために何か良い手はありますか?
Gordie
ベテラン
会議室デビュー日: 2003/10/14
投稿数: 64
投稿日時: 2003-11-21 16:49
METAタグのRefreshを使うとリロード動作が行われるので、Expires設定のテストにはなりません。
一旦別のページに飛ぶようなリンクをどこかに張っておいて、そこからまたリンクで戻ってくるようにしてみてください。
追記:他のページに飛ぶリンクを作らなくても、自分自身に飛ぶリンクでもいいんですが、
   見た目わかりにくいので一旦他ページに飛んだほうがよいかと。

サーバの生の応答を見るものとしては、秀まる夫氏作の「InetSpy」が手軽かと思います。


Expiresでの設定はリロードされるとキャッシュを無視するので、プロキシサーバを介在しない場合にはあまり効果がありません。


[ メッセージ編集済み 編集者: Gordie 編集日時 2003-11-21 16:53 ]

スキルアップ/キャリアアップ(JOB@IT)