2015-03-03 104 views
0

我对会话管理很困惑。我使用的是PHP,当用户点击登录按钮时,我的电话号码是session_start()作为我的脚本中的第一行。这样做的结果是客户端上一个名为PHPSESSID的cookie具有唯一的值。这似乎符合我的预期。如何清除会话cookie

我很困惑的地方就是注销过程。当用户点击'注销'时,我call session_unset();然后session_destroy();。我的期望是这应该清除cookie,但不是。即使当我关闭浏览器中的选项卡时,当我通过新选项卡返回网站时,该旧cookie仍然存在,以及旧的会话ID值。这意味着会话ID正在从一个会话重用到下一个(以及之后)。即使我再次通过登录过程,会话ID仍保持不变。这不可能是正确的,对吧?

在一个有点绝望的尝试,我试图用这个功能来清除cookie自身,但它似乎一事无成:

// destroy the cookies 
var cookies = document.cookie.split(";"); 

for (var i = 0; i < cookies.length; i++) { 
    var cookie = cookies[i]; 
    var eqPos = cookie.indexOf("="); 
    var name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie; 
    document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT"; 
} 

我是不是误解这个过程是如何工作的?或者我做错了什么(或两者都有!)。感谢您的任何建议或参考。

+0

你必须在注销页面开始会话('session_start')..你做了吗? – phpfresher 2015-03-03 04:41:33

+0

Cookie必须通过将cookie设置为前一次销毁。 – arunrc 2015-03-03 04:42:42

+0

@phpfresher - 就是这样。我没有意识到我需要这样做。如果您发布答案,我会接受它。谢谢! – Alex 2015-03-03 04:43:27

回答

0

你必须开始在注销页面也.. 你做的会话(session_start)?

+0

这是我的直接问题。谢谢! – Alex 2015-03-03 04:56:10

+0

欢迎您:) 祝您有美好的一天... – phpfresher 2015-03-03 04:56:43

1

您还需要取消设置会话变量并杀死饼干:

$_SESSION = array(); 

if (isset($_COOKIE[session_name()])) { 
    $params = session_get_cookie_params(); 
    setcookie(session_name(), '', 1, $params['path'], $params['domain'], 
      $params['secure'], isset($params['httponly'])); 
} 

这个问题已经被广泛here回答。

+0

这是一个有用的帖子。谢谢! – Alex 2015-03-03 04:45:01

1

它可以帮助你

session_start(); 
if (isset($_COOKIE['remember_user'])) { 
unset($_COOKIE['Hello']); 
unset($_COOKIE['HelloTest1']); 
setcookie('Hello', null, -1, '/'); 
setcookie('HelloTest1', null, -1, '/'); 
return true; 
} else { 
return false; 
} 
session_destroy(); 
header('Location:'); 
exit;