読者です 読者をやめる 読者になる 読者になる

タイガー!タイガー!じれったいぞー!(SE編)

AS400,WAS,GlassFish,Java,JavaEE,JSF等の開発における日々の気づきをまとめたブログ(備忘録)。

【JSF2】Resources(js,cssなど)のキャッシュ制御

JSF2開発において、共通部JavaScriptCSSのキャッシュが残っていることで変更した内容がすぐに反映せず、悪戦苦闘してしまいました。

HTTP、ブラウザの特徴、キャッシュ、クッキーなどなど。
ひとつひとつ理解していく必要がありそうです。

まずは、Firefoxで各ページごとに保有しているキャッシュ情報を取得してみます。
下記のサイトが大変参考になりました!

synclogue-navi.com

ふむふむ。アドレスバーに「about:cache」と入力すると、現在のキャッシュ情報の一覧が表示されました!
すばらしい!!! これでいつでも確認できますね♪

さて、JSF2での各ページのキャッシュ制御は、下記のように記述すれば、キャッシュしないページが作れることは理解しておりました。

<f:facet name="first">
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <meta http-equiv="Pragma" content="no-cache"/>
    <meta http-equiv="Cache-Control" content="no-cache"/>
    <meta http-equiv="Cache-Control" content="no-store"/>
    <meta http-equiv="Expires" content="0"/>
</f:facet>

しかしながら、ページにこの記述を入れても「webapp/resources」に配備しているJavaScriptcssなどはキャッシュされてしまうようです。

Stack Overflowの力を借りて、いろいろ調べていくと・・・

stackoverflow.com

DDの設定であるPROJECT_STAGEは、「Development」ではなく「Production」にしてね。
さらにキャッシュの有効期限の設定は「defaultResourceMaxAge」のパラメータで指定できるよ~、と解釈(合っているのか?)。

さっそく実験してみましょう。

<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Production</param-value>
</context-param>

<context-param>
    <param-name>com.sun.faces.defaultResourceMaxAge</param-name>
    <param-value>604800000</param-value> <!-- milli Seconds -->  
</context-param>

ちなみに、defaultResourceMaxAgeのパラメータの初期値(未定義の場合)は、604800000ミリ秒になるらしい。。。1週間です。

まずはdefaultResourceMaxAge指定なしで実施です。

f:id:no14141:20150319205648j:plain

うんうん。確かに今日から1週間先の日付がExpiresに書いてある!

次に、一度キャッシュを消去してから、defaultResourceMaxAgeを3,600,000ミリ秒(1時間)の設定で再度アクセス!

f:id:no14141:20150319205653j:plain

お! 1時間になりました。

あくまでもFirefoxでしか試していないので、半端間がありますが、とりあえずこの方法で運用させていこうかと思っております。