谷歌浏览器会话Cookie的解决方法

4
我最近发现,如果在Chrome中勾选“从上次离开的地方继续”,则cookies和sessionStorage会在浏览器重新启动时保留。此外,一些帖子讨论了即使关闭浏览器后Chrome后台进程仍然保持打开状态的问题。Stackoverflow和许多其他网站的帖子一个接一个地出现,许多人都问同样的问题,但没有人实际发布解决问题的真正解决方案。Chrome not clearing SESSION COOKIES on close/exit 我想也许我可以检测他们关闭窗口/标签,但这也行不通:javascript detect browser close tab/close browser 我在Chrome中检查了这个问题,认为现在应该有人报告过它了,并发现他们没有修复这个问题的计划:https://bugs.chromium.org/p/chromium/issues/detail?id=128513 还请参见这里:Chrome doesn't delete session cookies 在JavaScript中使用sessionStorage会在选中“继续上次浏览”并关闭标签页或窗口后仍然保留,但我不能指望最终用户更改该设置。因此,我想知道如何解决这个问题?有一篇文章提到将cookie的过期时间设置为1小时:http://erlycoder.com/111/google-chrome-session-cookie-expiration-issue-feature-your-personal-data-is-insecure-now-。虽然我可以设置cookie的过期时间,但即使我将值设为“1小时”,如果用户在一个小时内关闭并重新打开标签页,则会出现问题。有什么建议吗?

2
为什么这是个问题?在这些情况下保持“打开”的会话是一种功能,或者至少这是Chrome认为的。正如在错误报告中所说:“我们改变了它,因为“从我离开的地方继续”意味着“从我离开的地方继续””。这是一个完全合理的立场。就像你自己所说,“互联网仍然在运行”,那么问题到底是什么? - Karl Reid
2
你可以在会话中设置一个过期时间,并在每次页面加载时刷新它。如果在过期时间之后加载了页面,只需重新生成会话和相应的 cookie - 这实际上就是在 x 分钟不活动后强制执行超时的方法。 - CD001
@KarlReid 因为在我的应用程序中,保留了一些cookie导致出现问题。我需要一个全新的cookie集合,当他们带着旧的cookie返回页面时,应用程序的某些部分无法正常工作,除非清除这些cookie。更不用说这可能违反编码标准了:w3.org/Protocols/rfc2109/rfc2109, ......."CD001",假设我将过期时间设置为30分钟,他们关闭浏览器后10分钟又回来,结果发生了奇怪的行为。 - Josh Whitlow
2
这是你的代码问题,而不是他们的问题。你可能需要重新设计来解决这个问题,因为Firefox、Opera、Vivaldi和Edge也可能决定添加这种行为。 - Dave S
@DaveS Firefox 已经做了同样的事情。这是完全正常的。如果你想要"从上次离开的地方继续"/"恢复会话"的概念,这就是它的工作方式,也是正常行为。 - Karl Reid
根据建议对应用程序进行更改后,我回答了问题。我决定实现活动过期来解决这个问题。 - Josh Whitlow
1个回答

0

根据stackoverflow上的其他帖子以及对我重新设计应用程序问题的评论,我结合了一些帖子来在1小时后清除cookie和会话变量。

来源:

  • How do I expire a PHP session after 30 minutes?
  • Best way to completely destroy a session - even if the browser is not closed
  • http://php.net/manual/en/function.setcookie.php

    if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 3600)) {
    
        if (ini_get("session.use_cookies")) {
            $params = session_get_cookie_params();
            setcookie(session_name(), '', time() - 42000,
                $params["path"], $params["domain"],
                $params["secure"], $params["httponly"]
            );
        }
    
        if (isset($_SERVER['HTTP_COOKIE'])) {
            $cookies = explode(';', $_SERVER['HTTP_COOKIE']);
            foreach($cookies as $cookie) {
                $parts = explode('=', $cookie);
                $name = trim($parts[0]);
                setcookie($name, '', time()-1000);
                setcookie($name, '', time()-1000, '/');
            }
        }
    
        session_unset();
        session_destroy();
    
        echo '<script>window.location= "login.php?pre_action=session_expired";</script>';
    }
    $_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接