28

我在我的网站上使用基于会话的 cookie。令我完全惊讶的是,我注意到如果我设置了一个会话 cookie(不是持久性 cookie),关闭一个选项卡,然后重新连接到该站点,会话 cookie 仍然存在。实际上,这不是我所期望的。我本来希望会话 cookie 被删除。

如果关闭浏览器,会话 cookie 将被删除,那么为什么不关闭选项卡以获得相同的结果呢?

因此,我使用 PHP5 和 jQuery。我有什么办法可以在关闭选项卡时解决此会话问题?不幸的是,BODY 标记上的 onbeforeunload 事件在这里没有用,因为当您点击离开页面时,它会触发该事件,而不仅仅是关闭选项卡。

4

5 回答 5

22

会话 cookie 是每个进程而不是每个窗口。因此,即使您选择了新窗口,您仍然会得到相同的会话 ID。这种行为是有道理的。您不希望用户在浏览您的网站时每次打开新窗口时都重新登录。

我不知道有什么真正的方法可以解决这个问题。

于 2009-04-30T08:20:10.933 回答
7

这是设计使然,试图改变它是一个非常糟糕的主意。如果用户在新选项卡中打开一个链接并关闭它怎么办?是否应该销毁原始选项卡中的会话?当然不是!这说明了为什么你甚至不应该考虑这一点。

当最后一个浏览器窗口关闭时,会话结束。如果你想要别的东西,你:

  1. 不想要会话;
  2. 需要制作自己的“迷你会话”基础设施;
  3. 可能是在一个受伤和错误的世界。
于 2009-04-30T08:19:27.533 回答
6

如果您需要依赖选项卡关闭,可以使用会话 Web 存储来代替 cookie。

于 2017-03-30T15:23:51.967 回答
3

您还可以编写一个 javascript 来检测选项卡何时关闭并删除 javascript 中的 cookie

于 2011-03-06T11:29:04.410 回答
2

我找到了解决办法。

我在ASP.NET C#. Master Page除了页面之外,我对网站的所有页面都有一个Login。在Master Page服务器中Page Load event,我得到了Url引用页面并检查它是否包含站点的根目录,如果不是,我重定向到该Login页面,因为它没有Master Page显示。

如果我尝试从另一个站点访问页面,或者如果我输入Url浏览器的地址框,这将起作用。因此,如果您关闭选项卡并尝试从另一个选项卡重新进入或重新打开选项卡,即使 cookie 没有被杀死,您也无法在不通过 thru 的情况下重新进入该站点Login。即使您没有关闭选项卡并在同一选项卡中的不同站点之间导航,这也有效。

这是代码

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

从站点内导航时,即使您打开指向站点中另一个页面的链接到它打开的另一个选项卡,也没有问题。

如果您还想确保可以在重定向到页面if之前终止该子句中的会话和身份验证 cookie。Login

当用户导航到同一选项卡中的另一个站点并按下浏览器back to按钮时,这将不起作用,因为这适用于缓存并且不会自动向服务器发送请求。

因此,这不会在关闭选项卡时终止会话或身份验证 cookie,但它可以帮助防止在关闭选项卡后重新进入站点而不登录。

于 2017-06-25T09:41:14.720 回答