クエリに日付を入れてキャッシュ対策する

HTMLのiframeを使用して、外部リンクに接続するとき、外部リンクのキャッシュが残っていると、キャッシュが優先されて正しく読み取られないことがあります。

キャッシュを使用せずに外部ページを読み取る場合、URLのクエリに日時を入れることにより常に最新の情報を得るようにすることができます。 その方法がいくつかあるのでご紹介します。

JavaScriptを使用する方法

最も簡単な方法は、JavaScriptでクライアント側で日時のデータを入れてもらう方法です。 ソースはHTMLですが、AipoではVelocity上の挿入したい箇所に書きます。

<script type="text/JavaScript">
<!--
    document.write('<iframe  frameborder="0" scrolling="no" src="https://hogehoge.html?' + new Date().getTime() +'" allowtransparency="true"></iframe>');
//-->
</script>

document.writeでページが読み込まれた際にnew Date().getTime()で日時を作成してクエリにする方法です。

Ajaxを使用した場合、document.writeは実行されません。この現象も詳細については、参考文献を御覧ください。 そのような例外でJavaScriptを使用できない場合、以下の対応が必要です。

Screenファイルで日時を作成しVelocityに渡す方法

◯◯Screen.javaのdoOutputでは、contextの中に表示したいデータを格納します。 なので、日付の情報をcontextに格納していきます。

protected void doOutput(RunData rundata, Context context) throws Exception {

    try {
      Date date = new Date();
      // Date型の変数dateを作成

      context.put("updateDate", date.getTime());
      // date.getTime()で現在の時刻を取得し、Velocityから${updateDate}で呼べるようにする。

      String layout_template = "portlets/html/ja/test.vm";
      setTemplate(rundata, context, layout_template);
    } catch (Exception ex) {
      logger.error("TestScreen.doOutput", ex);
      ALEipUtils.redirectDBError(rundata);
    }
  }

updateDateが呼べるようになったので、test.vmに

<script type="text/JavaScript">
<!--
    document.write('<iframe  frameborder="0" scrolling="no" src="https://hogehoge.html?$!{updateDate}" allowtransparency="true"></iframe>');
//-->
</script>

のようにすると、キャッシュ対策ができるようになります。

この場合、getTimeの戻り値は1970年からの経過ミリ秒ですのでlong型の長い数値がクエリに入っていきます。 そこまでストイックに情報を最新にしなくていいと思う場合は、Screen.javaでformat()を使うか、Velocityの組み込みリファレンスの$flowなどを使うとよいかもしれません。

参考文献リスト

Velocityテンプレート

外部スクリプトのdocument.wiriteが何もしない条件について