会话没有被破坏

时间:2011-06-21 14:59:55

标签: php session logout

我有这个文件

secure.php     

session_start();
if(empty($_SESSION['u_name'])) {
    header("Location:emprego.php");
}

if(isset($_GET['logout'])) {
    session_destroy();
    header("Location:emprego.php");
}

$name = $_SESSION['u_name'];

?>

<li><?php echo "<a href='emprego.php?logout' id='D'>Logout</a>";?></li>

基本上,如果我注销,我将被重定向到emprego.php。但如果我点击后页按钮(浏览器中的箭头),我可以查看同一页面(secure.php)。

我的问题是,为什么?

感谢

5 个答案:

答案 0 :(得分:2)

http://nl2.php.net/manual/en/function.session-destroy.php

在这里看一下示例1。它明确指出你必须清除$ _SESSION。

if(isset($_GET['logout'])) {
    unset($_SESSION['u_name']); //makes it non-existent (it does unset) that variable
    session_destroy();
    header("Location:emprego.php");
}

答案 1 :(得分:0)

您的浏览器会在缓存中保留该页面的副本。单击后退按钮时,您将看到本地缓存副本,而不是服务器中的当前页面。如果您的安全性设置正确,您将无法从该缓存页面执行任何有意义的操作。

出于这个原因,安全网站(例如银行网站)会在您退出后告诉您注销并清除缓存(或关闭浏览器)。

答案 2 :(得分:0)

如果您正在使用会话cookie,请尝试明确地过期会话cookie,如下所示:

if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}

此外,返回浏览器只会加载页面的缓存副本。如果您尝试与缓存页面进行交互以从服务器获取新页面,则应该无法继续。

答案 3 :(得分:0)

我最近找到了header_remove(); http://php.net/manual/en/function.header-remove.php

    Caution: This function will remove all headers set by PHP, including cookies, session and the X-Powered-By headers.

不确定这是否是适当的方法,但它对退出功能非常有效。

答案 4 :(得分:0)

所有其他解决方案似乎都不适合我。但是,此解决方法可以解决问题。基本上,下面的代码会继续调用注销,直到注销成功为止:

if (isset($_GET["logout"])){
    if (isset($_SESSION["username"])) {
        unset($_SESSION["username"]);
        session_destroy();
        header("Location:/?logout=true");
        exit;
    }
    header("Location:/");
    exit;
}