タブを閉じるとセッションCookieが削除されないのはなぜですか?
質問
ウェブサイトでセッションベースのCookieを使用しています。驚いたことに、セッションCookie(永続的なCookieではない)を設定し、タブを閉じてからサイトに再接続すると、セッションCookieがまだ残っていることに気付きました。実際、それは私が期待していたことではありません。セッションCookieが削除されると予想していました。
ブラウザを閉じるとセッションCookieが削除されるので、同じ結果を得るためにタブを閉じてはどうですか?
したがって、私はPHP5とjQueryを使用しています。タブを閉じたときにこのセッションの問題を修正できるようにできることはありますか?残念ながら、BODYタグのonbeforeunloadイベントはここでは役に立ちません。ページから離れると、タブを閉じるだけでなく、そのイベントが発生するからです。
解決
セッションCookieはウィンドウごとではなくプロセスごとです。そのため、[新しいウィンドウ]を選択した場合でも、同じセッションIDを取得できます。この動作は理にかなっています。ユーザーがサイトの閲覧中に新しいウィンドウを開くたびに再サインインしたくないでしょう。
これを回避するための実際の方法を知らない。
他のヒント
これは仕様によるものであり、変更しようとするのは非常に悪い考えです。ユーザーが新しいタブでリンクを開き、それを閉じるとどうなりますか?元のタブのセッションを破棄する必要がありますか?もちろん違います!これは、なぜこれについても考えてはならないのかを示しています。
最後のブラウザウィンドウが閉じると、セッションが終了します。他に何かが欲しいなら、あなた:
- セッションを望まない;
- 独自の「ミニセッション」を作成する必要があるインフラストラクチャ;
- おそらく怪我やバグの世界に陥っています。
タブが閉じられたことを検出するJavaScriptを記述し、JavaScript内のCookieを削除することもできます
タブの閉鎖に依存する必要がある場合、Cookieの代わりにセッションWebストレージを使用できます。
回避策が見つかりました。
ASP.NET
C#
で作業しています。 Login
ページを除く、サイトのすべてのページの Master Page
があります。 マスターページ
サーバー Page Loadイベント
で、参照ページの Url
を取得し、サイトのルートが含まれているかどうかを確認します。 Login
ページにリダイレクトするのではなく、その Master Page
がないため、表示されます。
これは、別のサイトからページにアクセスしようとした場合、またはブラウザーのアドレスボックスに Url
を入力した場合に機能します。したがって、タブを閉じて別のタブから再入力またはタブを再度開こうとすると、Cookieが削除されていない場合でも、 Login
を実行せずにサイトに再入力することはできません。これは、タブを閉じておらず、同じタブ内の異なるサイト間を移動している場合でも機能します。
これはコードです
if (Request.UrlReferrer == null || !Request.UrlReferrer.AbsoluteUri.ToString().Contains("root"))
{
Response.Redirect("~/Account/Login.aspx");
}
サイト内から移動する場合、サイト内の別のページへのリンクを開いても、別のタブが開いても問題ありません。
さらに確認したい場合は、ログイン
ページにリダイレクトする前に、 if
句のセッションと認証Cookieを強制終了できます。
ユーザーが同じタブ内の別のサイトに移動してブラウザーの back to
ボタンを押した場合、キャッシュでは機能し、サーバーにリクエストを自動的に送信しないため、これは機能しません。
これにより、タブを閉じてもセッションまたは認証Cookieが強制終了されることはありませんが、タブを閉じた後にログインせずにサイトに再入することを防ぐことができます。