2010-02-11 162 views
14

我正在尝试正确注销管理员用户。这里是我的功能:(PHP)如何正确销毁会话cookie?

function logout() 
{ 
    $_SESSION = array(); //destroy all of the session variables 
    if (ini_get("session.use_cookies")) { 
     $params = session_get_cookie_params(); 
     setcookie(session_name(), '', time() - 42000, 
      $params["path"], $params["domain"], 
      $params["secure"], $params["httponly"] 
     ); 
    } 
    session_destroy(); 
} 

基本上,一旦我验证密码,我设置会话为有效(只有1个用户总数)。现在,当管理员点击注销时,我想销毁当前会话,并销毁cookie,以便他们不能仅仅使用浏览器中存储的会话cookie返回管理页面。但我的代码不起作用。我打出注销,我可以直接导航回管理页面。但是,如果我删除我的Cookie,功能是完美的。那么这里的Cookie删除功能有什么问题?

回答

6

也许你的问题不是cookie,但浏览器显示你的管理页面的缓存版本。那可能吗?如果在您点击F5时消失,则可能是这样。这可以通过设置正确的cache-control标题来排序。

检查出this SO question关于如何设置缓存的问题。问题恰恰相反(迫使浏览器缓存),但你会弄清楚要改变什么来关闭缓存。

+0

好的,这是有道理的,但为什么我仍然能够直接访问管理页面,即使我已经销毁会议? – sepiroth 2010-02-11 02:12:29

+0

@hatorade,检查我编辑的答案。 – 2010-02-11 02:14:00

+2

没想到我认为我想通了 - 我没有在我的注销页面上呼叫session_start()(注销文本链接到一个注销页面,该页面调用了我的上述功能) – sepiroth 2010-02-11 02:15:03

8

如果你真的要覆盖所有基地尝试这样做:

setcookie (session_id(), "", time() - 3600); 
session_destroy(); 
session_write_close(); 

这应该防止对PHP执行其余的会话数据的进一步访问。浏览器可能仍然显示该cookie但是被设置$ _SESSION超级将会是空白

+15

在我看来,你应该在第一行写'session_name()'(相当于'PHPSESSID')。 – 2013-11-29 12:58:37