セッションIDが死んでいるか生きているかを検出する方法は? 誰かがログインしたとします。新しいセッションが作成され、セッション ID が保存されます。彼が別のブラウザからログインした場合、2 回ログインしていると判断できます。しかし、彼がログアウトしたかどうかを検出する方法は?
5 に答える
あなたがする必要があるのは、彼が新しいブラウザで彼のアカウントにログインし、彼のアカウントに関連付けられている古いセッションIDを見つけて、それを期限切れにするときです。彼がログアウトボタンをクリックすると、そのセッションIDを廃止できます。
編集:
申し訳ありませんが、あなたの質問を間違って読みました。実行したいのは、セッションタイムアウトを設定して、タイムアウトに達した場合に、セッションが停止していると想定して期限切れにすることです。ページリクエストごとに、有効期限を更新して有効にします。別のブラウザからログインする場合は、古いブラウザのセッションが古いと見なして、すぐに期限切れにするか、タイムアウトで期限切れにすることができます。
次に、ページの読み込み時にセッションタイムアウトを確認するか、セッションデータベースを介して実行され、すべての古いセッションを期限切れにするcronスクリプトを実行できます。
ユーザーがログインするときは、セッション変数を設定して、ログインしていることを示す必要があります。
ユーザーがログアウトした場合は、を使用session_destroy()
してセッションを終了する必要があります。
このように変数は破棄されるため、セッション変数をチェックするとtrueにはなりません。私は個人的に使用します$_SESSION['isLoggedIn'] = TRUE
。
編集して追加:これを複数のブラウザーまたはコンピューターで機能させる場合は、ログインIDまたはセッションIDをデータベースに保存して、ユーザーが他の場所でログインしているかどうかを確認できるようにする必要があります。
一般的に言えば、「ログイン」のアクションは通常、ある種の永続層、通常はデータベース サーバー内のユーザーのテーブル/コレクションにリンクされています。
ログイン時にこの保存されたデータを使用してセッションが作成され、保存されたデータは何らかの方法で$_SESSION
スーパーグローバルにシリアル化されます。
ログイン/ログアウトをグローバルに追跡する場合は、どこからでもログイン/ログアウトした回数を表す単調に増加する 2 つの整数に関連付けられたユーザーの ID (通常は電子メールまたはログイン資格情報) を保存する必要があります。
これを DB で実行しなければならないという厳格な規則はありません。拡張性が向上するだけです。小規模またはテスト ケースの場合は、ページング ファイルを簡単に保存できます。
主な考え方は、サーバー上のセッションを参照する Cookie の有効期限を超えて存続するあらゆる種類のデータを保持するには、session_id
何らかの形式の永続性を実装する必要があるということです。
ユーザーがログインするときに $_SESSION[] を使用し、変数を true に設定します。必要に応じて、セッション変数にデータを保存することもできます。ユーザーがログアウトをクリックしたら、セッション変数を false に設定します。コードは次のようになります。
function Login()
{
if(!isset($_SESSION)){ session_start(); }
if(!$this->CheckLoginInDB($email,$password))
{
return false;
}
$_SESSION[$this->GetLoginSessionVar()] = $email;
return true;
}
function GetLoginSessionVar()
{
$retvar = md5($this->rand_key);
$retvar = 'usr_'.substr($retvar,0,10);
return $retvar;
}
function LogOut()
{
session_start();
$sessionvar = $this->GetLoginSessionVar();
$_SESSION[$sessionvar]=NULL;
unset($_SESSION[$sessionvar]);
}
これは簡単な方法の 1 つです。タイムアウトが必要な場合。$_SESSION[] 変数の開始時間を使用してから、タイムアウト時間を設定できます。その時間までのアクティビティを確認してから、次のようにサインアウトします。
function LogOut(){
session_start();
// set timeout period. This will be in seconds.
$inactive = 1000;
// check to see if $_SESSION['timeout'] is set
if(isset($_SESSION['timeout']) ) {
$session_life = time() - $_SESSION['start'];
if($session_life > $inactive)
{ session_destroy(); header("Location: logoutpage.php"); }
}
$_SESSION['timeout'] = time();
}
これを行うためのより良い方法があるかもしれません。私はそれを自分で行うためのより良い方法を探しています。それが役に立てば幸い。
したがって、彼がブラウザを閉じると、いずれにせよ、非アクティブの後にログアウトされます。ただし、ブラウザを閉じた後にログアウトする場合は、ini.session.cookie-lifetimeを確認してください
そのためには、ユーザーテーブルにログインするか、セッションをDBに保存するように切り替える必要があります。その後、ユーザーに対してセッションを確認できます(そのように設定した場合)。