调整注销功能以处理safari后退按钮问题

DCR*_*DCR 12 html php safari

我有以下logout()函数,适用于大多数浏览器,但不适用于safari.safari中的问题是在注销后如果用户点击后退按钮,他们从缓存而不是登录屏幕获取上一页.有没有办法调整注销功能来处理这个问题?

function logout()
{   
    // unset any session variables
    $_SESSION = [];

    // expire cookie
    if (!empty($_COOKIE[session_name()]))
    {
       // setcookie(session_name(), "", time() - 42000);
       $params = session_get_cookie_params();            
       setcookie(session_name(), '', time() - 42000,
                 $params["path"], $params["domain"],
                 $params["secure"], $params["httponly"]);
    }

    // destroy session
    session_destroy();        
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*Mat 2

在我看来,这是一个浏览器问题,而不是服务器问题。

  1. 您是否尝试过配置缓存标头以禁止缓存已记录的页面?

  2. 作为另一个解决方案,我发现了一个相关的SO帖子:Preventing cache on back-button in Safari 5

您可以尝试这个解决方案,该解决方案基本上是将这段 javascript 放入您记录的页面中:

window.onpageshow = function(event) {
    if (event.persisted) {
        window.location.reload() ;
    }
};
Run Code Online (Sandbox Code Playgroud)

要仅在注销后重新加载页面,您可以检查是否有 cookie,这样后退按钮在登录时仍然可以使用。只需将"yourCookieName"字符串更改为您的会话 cookie 名称即可。

function getCookie(cname) {
    var name = cname + "=";
    var ca = document.cookie.split(';');
    for(var i=0; i<ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1);
        if (c.indexOf(name) == 0) return c.substring(name.length, c.length);
    }
    return null;
}

function hasCookie(cname) {
     return getCookie(cname) !== null;
}

window.onpageshow = function(event) {
    if (event.persisted && !hasCookie("yourCookieName")) {
        window.location.reload(); // or redirect to login page
    }
};
Run Code Online (Sandbox Code Playgroud)

注意:我认为解决方案 2 中的缓存仍然存在于 Safari 中。因此,在我看来,这实际上并不是一个正确处理安全性的解决方案。