プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
セッションとhistory.back()とブラウザの戻るボタン。
セッションを利用して

1.登録画面
 →静的HTML

2.確認画面
 →POSTされたデータをセッション情報に設定

3.完了画面
 →セッション情報内のデータを登録後セッションクリア

な感じの一般的な登録画面を作った時の事。
「3.完了後にブラウザの戻るボタン押すと、登録した内容が残ってる」と
中々やりおるわいなご指摘を頂きました。

んで、ブラウザの戻るボタン(history.back())について
実はちゃんと理解していなかった事に気づいたので検証してみた。


遷移:登録.php→確認.php→完了.php

登録.php
 http_referer = test.html
 session内変数 = 空
 POSTデータ = 無し

確認.php
 http_referer = 登録.php
 session内変数 = 設定済み
  ※POSTされたデータが確認.phpの処理でsessionに設定される
 POSTデータ = 有り

完了.php
 http_referer = 確認.php
 session内変数 = 空
  ※登録完了処理でsessionが破棄される為
 POSTデータ = 無し


この状態で、ブラウザの戻るボタンで戻ると以下のようになる。


遷移:完了.php→(有効期限切れ)→(リロード)→確認.php

完了.php
 http_referer = 確認.php
 session内変数 = 空
  ※登録完了処理でsessionが破棄される為
 POSTデータ = 無し

確認.php
 http_referer = 登録.php
 session内変数 = 設定済み
  ※POSTされたデータが確認.phpの処理でsessionに設定される
 POSTデータ = 有り


つまり、戻るボタンで戻った後の確認.phpの状態は
登録.php→確認.php後と全く同じ状態。
見た目上は前のデータが保持されているように見えるが、実際には

1.完了.phpでsessionはクリアされる。
2.確認.phpに戻った時に再度データがPOSTされる
3.確認.php内の処理で再度sessionに値が設定される
4.確認.php内の処理でsessionに設定された値を表示

となっていた訳ですよ。困った困った。

仕方ないので以下のようにして対処。


1.登録画面
 (1)処理の最後にsession内の変数に1を設定。

2.確認画面
 (2)session内の変数の値が1以外ならsessionクリアして「1.」に移動。
 (3)処理の最後にsession内の変数に2を設定。

3.完了画面
 (4)session内の変数の値が2以外なら値クリアして「1.」に移動。


これで、登録完了後に戻るボタンで戻っても
(2)のチェックで引っかかる(既にsessonクリア済みなんで値が無い)ので
大丈夫になりましたとさ、めでたしめでたし。


おまけですが、PHPでsession_start()すると
「キャッシュしないでね」のヘッダが自動的に送られるみたいですね。
キャッシュしたけりゃphp session_cache_limiter()でうんちゃらかんちゃら
適当にしなさいって事みたいです。
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● PHP  thema:プログラミング - genre:コンピュータ  Posted by ササキマコト 

  関連記事