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

时间:2015-06-13 16:13:13

标签: php html 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();        
}

2 个答案:

答案 0 :(得分:2)

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

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

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

  3. 你可以试试这个基本上把这个javascript放在你记录的页面中的解决方案:

    window.onpageshow = function(event) {
        if (event.persisted) {
            window.location.reload() ;
        }
    };
    

    要仅在注销后重新加载页面,您可以检查没有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
        }
    };
    

    注意:我认为缓存仍然存在于带有解决方案2的Safari中。因此,在我看来,这并不是真正解决安全问题的解决方案。

答案 1 :(得分:1)

在代码中使用重定向功能,例如

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"]);
    }

// to redirect the user to login page

$return_url = "login.php"; //I'm using login.php you can change it according to your page

// destroy session
session_unset();
session_destroy();

header('Location:'.$return_url); //to redirect to user
}

还可以通过

来验证用户会话是否存在
session_start();
if($_SESSION[name]=="") {
header("location:index.php");
}
  

注意:需要在所有页面中对用户进行身份验证才能访问   页面如果只有会话