ブラウザのキャッシュの挙動

PRGパターンを使ったWebアプリケーションを実装するに当たって、最後のGetの際に最新のページではなく、以前のキャッシュされたページが表示されてしまうことがあるのではないかと思い調査している。

例えばform.jspに以下のようなフォームとリンクを設置する。

<form method="post" action="submit.jsp">
  <input type="submit" value="go(post)" />
</form>

<form method="get" action="submit.jsp">
  <input type="submit" value="go(get)" />
</form>

<a href="submit.jsp">go(link)</a>

submit.jspでは、単に結果ページにリダイレクトするだけ。

<%
  response.sendRedirect("result.jsp");
%>

result.jspでは現在の日時を表示。

<%
<p>今の時刻は<%= new Date().toString() %>です。</p>
%>

どの画面でもキャッシュに関するヘッダの設定はしていない。

で、一度result.jspを表示してブラウザにキャッシュさせておいた上で、フォーム(post)、フォーム(get)、リンク、直接アクセス(ブラウザのアドレスバーに直接「result.jsp」を入力)の4パターンで試してみた。結果は以下の通り。

ケースFirefox2IE6
フォーム(post)
フォーム(get)
リンク
直接アクセス×

「○」は最新のページが表示されたことを、「×」はキャッシュされたページが表示されたことを表す。

というわけで、直接アクセス時にも最新のページを表示させたい場合以外は、特にページのキャッシュ制御は不要という結果になった。

でも昔(3、4年前)はIEだとPRGでも最後のGetでキャッシュされたページが表示されていた気がするんだけどなぁ。

またはてなダイアリーとかは、Firefox2であってもログイン後にリダイレクトされてきた画面で未ログイン状態に見えたりする。どうなってるんだろ。