我在网站上使用基于会话的Cookie。令我完全惊讶的是,我注意到如果我设置会话cookie(不是持久cookie),关闭选项卡,然后重新连接到站点,会话cookie仍然存在。实际上,这不是我所期望的。我原以为会删除会话cookie。
如果您关闭浏览器,会删除会话cookie,那么为什么不关闭标签以获得相同的结果呢?
因此,我正在使用PHP5和jQuery。有什么我可以这样做,当一个标签关闭时,我可以解决这个会话问题?不幸的是,BODY标记上的onbeforeunload事件在这里没有用,因为当你点击页面时它会触发该事件,而不仅仅是关闭一个标签。
答案 0 :(得分:16)
会话cookie是按进程而不是每个窗口。因此,即使您选择了新窗口,您仍然可以获得相同的会话ID。这种行为是有道理的。您不希望用户在浏览您的网站时每次打开新窗口时重新登录。
我并不知道任何真正的方法。
答案 1 :(得分:8)
这是设计并试图改变它是一个非常糟糕的主意。如果用户在新标签页中打开链接并关闭该链接,该怎么办?是否应销毁原始标签中的会话?当然不是!这证明了为什么你甚至不应该考虑这个。
会话在最后一个浏览器窗口关闭时结束。如果你想要别的东西,你:
答案 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,但它可以帮助防止在关闭选项卡后不重新登录网站。