web-dev-qa-db-ja.com

タブを閉じてもセッションCookieが削除されないのはなぜですか?

WebサイトでセッションベースのCookieを使用しています。驚いたことに、セッションCookie(永続的なCookieではない)を設定し、タブを閉じてからサイトに再接続すると、セッションCookieがまだ残っていることに気付きました。実際、それは私が期待していたことではありません。セッションCookieが削除されることを期待していました。

ブラウザを閉じるとセッションCookieが削除されるので、同じ結果を得るためにタブを閉じてみませんか?

したがって、私はPHP5とjQueryを使用しています。タブを閉じたときにこのセッションの問題を修正できるようにできることはありますか?残念ながら、BODYタグのonbeforeunloadイベントは、ページから離れてクリックすると、タブを閉じるだけでなく、そのイベントを発生させるため、ここでは役に立ちません。

23
Volomike

セッションCookieは、ウィンドウごとではなくプロセスごとです。したがって、[新しいウィンドウ]を選択した場合でも、同じセッションIDを取得できます。この動作は理にかなっています。ユーザーがサイトの閲覧中に新しいウィンドウを開くたびに再サインインすることは望ましくありません。

私はこれを回避する実際の方法をすぐに知りません。

16
Paul Alexander

これは仕様によるものであり、変更しようとするのは非常に悪い考えです。ユーザーが新しいタブでリンクを開いて閉じた場合はどうなりますか?元のタブのセッションを破棄する必要がありますか?もちろん違います!これは、これについて考えるべきではない理由を示しています。

最後のブラウザウィンドウが閉じると、セッションは終了します。他のものが必要な場合は、次のようにします。

  1. セッションを望まない;
  2. 独自の「ミニセッション」インフラストラクチャを作成する必要があります。
  3. おそらく傷とバグの世界にいるでしょう。
8
Sander

タブの閉鎖に依存する必要がある場合は、Cookieの代わりにセッションWebストレージを使用できます。

4
Lexera

タブが閉じられたことを検出するJavaScriptを記述し、JavaScript内のCookieを削除することもできます。

3
junkam

回避策を見つけました。

私はASP.NETC#で働いています。 Loginページを除くサイトのすべてのページにMaster Pageがあります。 Master PageサーバーPage Load eventで、参照ページのUrlを取得し、サイトのルートが含まれているかどうかを確認します。含まれていない場合は、Loginページにリダイレクトし、Master Pageが表示されないためです。

これは、別のサイトからページにアクセスしようとした場合、またはブラウザのアドレスボックスにUrlを入力した場合に機能します。したがって、タブを閉じて別のタブから再入力するか、タブを再度開こうとすると、Cookieが強制終了されていなくても、Loginを経由せずにサイトに再入力することはできません。これは、タブを閉じておらず、同じタブ内の異なるサイト間を移動している場合でも機能します。

これはコードです

   if (Request.UrlReferrer == null || !Request.UrlReferrer.AbsoluteUri.ToString().Contains("root"))
        {
            Response.Redirect("~/Account/Login.aspx");
        }

サイト内からナビゲートする場合、サイト内の別のページへのリンクを開いて別のタブに移動しても問題ありません。

さらに、ifページに戻る前に、そのLogin句でセッションと認証Cookieを強制終了できることを確認したい場合。

これは、ユーザーが同じタブで別のサイトに移動してブラウザのback toボタンを押した場合は機能しません。これは、キャッシュで機能し、サーバーにリクエストを自動的に送信しないためです。

したがって、これはタブを閉じたときにセッションまたは認証Cookieを強制終了しませんが、タブを閉じた後にログインせずにサイトに再び入るのを防ぐのに役立ちます。

1
Dov Miller