度々お世話になっております。
phpによる基礎的なセッションタイムアウトの方法について
で質問させて頂いた者です。
一定時間が経過後にタイムアウトを行わせる画面遷移を考えておりますが、アドバイスを頂いたおかげで、基本的な流れを作るところまで辿り着きました。考え方はこうです。
<画面A>
セッションが無い時は作成し、開いた時間をセッション変数(t)にSAVE
セッションがある場合は、開いた時間をセッション変数(t)と比較して、一定時間経過後に画面Bに遷移させる。
<画面B>
セッションの削除
エラーメッセージを表示してボタン押下時に画面を閉じる
基本的にはこの画面でほぼ動作することを確認しましたので、最終的には、各画面に<画面A>と同じチェック処理を入れることを考えています。
確認の動作としては、
- <画面A>で一定時間後に、画面をリロードすると、<画面B>に遷移
- <画面B>でスクリプトを閉じる操作をした時、フォームは閉じるが、空白の画面が残る。
- 再度、<画面A>を呼び出した時も、同じ動作になる
ことを確認しました。
ただ、この時、<画面B>の状態でブラウザの戻るボタンを押すと、<画面A>に戻ってしまうため、それを防止するため、
javascript
1window.onunload = function(){}; 2history.forward();
と入れたところ、<画面A>に戻らなくなったので、無事解決となりました。
ところが、<画面A>のURLを呼び出したところ、<画面A>の処理の中で、セッションが残っている状態、つまり、(if(isset($_SESSION['LOGIN_INFO'])))と判定され、自動的に<画面B>に遷移する動きになってしまいました。
再度呼び出しても同じなのですが、<画面B>で戻るボタンを一度押した状態で、<画面A>を呼び出したところ、呼び出せることが判ったのですが、解決策が見つからなく困っております。
おそらくセッションの解放のしかたに問題があるのではないかと思うのですが、識者のアドバイスを頂ければ幸いです。
PC側の実行環境は、Windows10で、ChromeとFirefoxでこの状況になります。IE11だとフォームを完全にクローズするため、この現象は出ません。
php
1<画面A> 2<?php 3 if( !isset( $_SESSION ) ) { 4 session_start(); 5 } 6 // セッションが存在していない(タイムアウトもしくはログアウトされている) 7 if(!isset($_SESSION['LOGIN_INFO'])) { 8 $_SESSION['LOGIN_INFO'] = true; 9 $_SESSION['LAST_TIME'] = date("Y-m-d H:i:s"); 10 // セッションが存在している場合はセッションのライフタイムを更新 11 } else { 12 $_SESSION['LOGIN_INFO'] = true; 13 $last_tm = $_SESSION['LAST_TIME']; 14 $_SESSION['LAST_TIME'] = date("Y-m-d H:i:s"); 15 print "last:{$last_tm}<br />"; 16 print "now:{$_SESSION['LAST_TIME']}<br />"; 17 // 時刻差(秒数) 18 $diff_min = (strtotime($_SESSION['LAST_TIME']) - strtotime($last_tm)); 19 if ($diff_min > 5){ 20 echo "<script> window.location.replace('ss_timeout.php'); history.pushState(null, null, null); </script>"; 21 } 22 } 23 echo "<br /><a href='sess02.php'>サンプル画面2へ</a>"; 24?>
html
1<画面B> 2<html> 3<head> 4<script language="JavaScript"> 5<!-- 6window.onunload = function(){}; 7history.forward(); 8//--> 9</script> 10</head> 11<body> 12<?php 13// セッションの切断 14if( isset( $_SESSION ) ) { 15 $_SESSION = array(); 16 if (isset($_COOKIE["PHPSESSID"])) { 17 setcookie("PHPSESSID", '', time() - 1800, '/'); 18 } 19 session_destroy(); 20} 21?> 22<div> 23 <p>長時間使用されていないため、タイムアウトが発生しました。</p> 24 <p>「閉じる」ボタンをクリックして終了して下さい。</p> 25 <p><div align="center"><a href="javascript:window.open('about:blank','_self').close();">閉じる</a></div></p> 26</div> 27</body> 28</html>

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/06/20 09:48
2019/06/21 05:39