为什么不关闭选项卡删除会话Cookie?

时间:2009-04-30 08:16:53

标签: session cookies tabs

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

如果您关闭浏览器,会删除会话cookie,那么为什么不关闭标签以获得相同的结果呢?

因此,我正在使用PHP5和jQuery。有什么我可以这样做,当一个标签关闭时,我可以解决这个会话问题?不幸的是,BODY标记上的onbeforeunload事件在这里没有用,因为当你点击页面时它会触发该事件,而不仅仅是关闭一个标签。

5 个答案:

答案 0 :(得分:16)

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

我并不知道任何真正的方法。

答案 1 :(得分:8)

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

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

  1. 不想要会话;
  2. 需要建立自己的“迷你会话”基础设施;
  3. 可能是为了一个受伤和错误的世界。

答案 2 :(得分:3)

您还可以编写一个javascript来检测标签何时关闭,并删除javascript中的cookie

答案 3 :(得分:2)

如果您需要依赖制表符关闭,可以使用会话网络存储而不是cookie。

答案 4 :(得分:1)

我找到了一个解决方法。

我在ASP.NET C#工作。除了Master Page页面之外,我对网站的所有页面都有Login。在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,但它可以帮助防止在关闭选项卡后不重新登录网站。