Session 为什么';是否关闭选项卡并删除会话Cookie?

Session 为什么';是否关闭选项卡并删除会话Cookie?,session,cookies,tabs,Session,Cookies,Tabs,我在我的网站上使用基于会话的cookies。令我完全惊讶的是,我注意到如果我设置了一个会话cookie(不是持久cookie),关闭一个选项卡,然后重新连接到站点,会话cookie仍然存在。事实上,这不是我所期望的。我本以为会删除会话cookie 如果关闭浏览器,会话cookie将被删除,那么为什么不关闭选项卡以获得相同的结果呢 因此,我使用PHP5和jQuery。我是否可以在关闭选项卡时解决此会话问题?不幸的是,BODY标签上的onbeforeunload事件在这里没有用处,因为当您从页面上单

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

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


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

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

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

  • 不需要会话
  • 需要建立自己的“迷你会话”基础设施
  • 可能是在一个充满伤害和虫子的世界里

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


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

    您还可以编写一个javascript来检测选项卡何时关闭,并删除javascript中的cookie。如果您需要依赖于选项卡关闭,可以使用web存储代替cookie。

    我找到了一个解决方法

    我在
    ASP.NET
    C#
    工作。我有一个
    母版页
    ,用于站点的所有页面,除了
    登录
    页面。在
    母版页
    服务器
    页面加载事件
    中,我获取引用页面的
    Url
    ,并检查它是否包含站点的根目录,若不包含,我重定向到
    登录
    页面,因为它并没有
    母版页
    ,所以它会显示出来

    如果我试图从另一个站点访问某个页面,或者如果我在浏览器的地址框中输入
    Url
    ,这种方法就可以实现。因此,如果您关闭该选项卡,并尝试从另一个选项卡重新进入或重新打开该选项卡,即使cookie没有被杀死,您也无法在不通过
    登录的情况下重新进入该站点。即使您没有关闭该选项卡,也可以在同一选项卡中的不同站点之间导航

    这是密码

       if (Request.UrlReferrer == null || !Request.UrlReferrer.AbsoluteUri.ToString().Contains("root"))
            {
                Response.Redirect("~/Account/Login.aspx");
            }
    
    从站点内部导航时,即使打开指向站点中另一页的链接并指向它打开的另一个选项卡,也没有问题

    如果您想进一步确保在重新访问
    登录
    页面之前,可以在
    If
    子句中终止会话和身份验证cookie

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


    因此,这不会在关闭选项卡时终止会话或身份验证cookie,但有助于防止在关闭选项卡后未登录就重新进入网站。

    这里的问题是公共环境,如图书馆,以及其中包含身份信息的某个人的在线配置文件。我需要想出一个解决办法。然而,似乎你对这个问题有一些好的答案,应该从中选出一个作为正确答案。也许您还想开始一个新问题?假设打开一个新选项卡并销毁以前的选项卡会话是一个坏主意是错误的。事实证明,这一想法对那些需要额外安全性的网站是有益的,因为用户不必再次登录并触发某些API。它们可以提供更好的用户界面。所以不,如果Stackoverflow给了我额外的投票权,我会对这个答案投反对票。Paul,请看下面我对Sander的评论,“这里的问题…”在这种情况下,制表符关闭不是主要问题。它更主动地控制会话的过期。您需要在JS中的客户端上实现某种活动超时,在没有用户活动后自动注销。你会在大多数银行网站上发现这种行为。保罗,你是对的。我在这个问题上睡了一觉,这就是我计划采取的行动。现在再问一个stackoverflow问题,关于实现这一点的最佳方法。我认为,如果有人想出跨平台的破解方法,以90%的准确率检测标签刚刚关闭,而不是以任何其他方式关闭页面,他们将成为网络上的英雄。你怎么能做到这一点呢?在卸载事件之前尝试添加一个侦听器我做了类似$(窗口)的事情。滚动(函数(){if(sessionStorage.getItem('advertOnce')!='true'){sessionStorage.setItem('advertOnce','true');initPopup();})@Hammer beforeunload事件也会在用户单击任何链接等时触发,而不仅仅是关闭选项卡。我认为这是最有用的答案,以及在接受的答案中解释的内容。是的,您可以做您似乎想做的事情,只需使用会话存储。有关更多信息,请参阅