使用 cookie 时注销

Posted

技术标签:

【中文标题】使用 cookie 时注销【英文标题】:Logout when using cookies 【发布时间】:2014-09-29 17:17:18 【问题描述】:

我是使用 php cookie 的初学者,我正在尝试使用 cookie 制作一个简单的登录和注销表单。一切都很好,但是当我按下注销链接时,我无法注销。要注销,我必须从浏览器中删除 cookie。

登录页面

<?php
session_start();

if (isset($_COOKIE["Email"]))
    header("location: home.php");    

?>


<form method="post" action="log_in.php">   
<font size="6">Sign In</font>

Email Address: </b></font><input type="text" name="Email" id="email"  />  

password:  <input type="password" name="password" id="password"  />    

<input type="checkbox" name="rememberMe" value="1" id="check"/> Remember Me

<input type="submit" name="Login" id="sign" value="sign in" >

<?php 
include 'db.php';
if(isset($_POST['Login']))
    $user_email = $_POST['Email'];  
    $password = $_POST['password'];

    $check_user = "SELECT * FROM user where user_email  = '$user_email' AND user_pass = '$password'";
    $run = mysql_query($check_user );

    if (mysql_num_rows($run) > 0)
        $_SESSION['Email']= $user_email;   

        $_SESSION['start'] = time(); 
        if(isset($_POST['rememberMe']))
            $expire=time()+120;
            setcookie("Email", "Email", $expire);
        
    else
        $expire=time()+30;
        setcookie("Email", "Email", $expire);
    
    echo "<script>window.open('home.php','_self')</script>";   

else 
    echo "<script>alert('email or password incorrect!')</script>";     

?>

主页

<?php
if (isset($_COOKIE["Email"]))
  echo "Welcome " . $_COOKIE["Email"] . "!<br>";
    echo '<a href="logoutForm.php">logout</a>';

else
    $now = time(); // Checking the time now when home page starts.
    if ($now > $expire) 
        session_destroy();
        header("location: log_in.php");    

退出页面

 <?php
 session_start();
 unset($_SESSION['Email']);
 session_destroy();
 header("Location: log_in.php");

 if(isset($_SESSION['Email'])):
     setcookie($_SESSION['Email'],'',time()-7000000,'/');
 endif;
 ?>

【问题讨论】:

您似乎只是在取消设置您的电子邮件会话变量。您还使用了$_SESSION['start'],所以它仍然处于设置状态。您可以尝试unset($_SESSION); 取消设置所有会话变量。 您的主页没有session_start();,至少在您发布的内容中没有;这是必需的。 【参考方案1】:

如果你想彻底销毁会话,你可以使用 session_destroy()

<?php
session_start();
session_destroy();
?>

或者,如果您只是想取消设置电子邮件,您可以使用

<?php
session_start();
if(isset($_SESSION['Email']))
  unset($_SESSION['Email']);
?>

【讨论】:

session_start();在使用session_destroy();时需要包含【参考方案2】:

您的主页(代码)没有session_start();,至少在您发布的内容中没有;使用session_destroy()时需要;它不能单独工作。

试一试:

旁注: $expire 未定义 home page 代码,因此您需要使用与其他页面相同或相似的方法。

<?php
if (isset($_COOKIE["Email"]))
  echo "Welcome " . $_COOKIE["Email"] . "!<br>";
    echo '<a href="logoutForm.php">logout</a>';

else
    $now = time(); // Checking the time now when home page starts.
    if ($now > $expire)  // $expire is undefined
        session_start(); // <= required
        session_destroy(); // <= does not work on its own
        header("location: log_in.php");    
    

【讨论】:

我尝试添加 session_start();在主页但它不起作用,我认为是注销页面的问题。 注销页面中的unset($_SESSION['Email']);;你试过unset($_SESSION);吗? @user3891365 将取消设置所有会话。 @user3891365 另外,在您的注销页面中尝试使用setcookie($_SESSION['Email'],'',time()-7000000,'/'); 而不是setcookie($_COOKIE['Email'],'',time()-7000000,'/'); @user3891365 我发现的另一件事;在您的主页中$expire 未定义,这是一个促成因素。在您打开 &lt;?php 标记 error_reporting(E_ALL); ini_set('display_errors', 1); 之后将错误报告添加到该文件或所有文件的顶部,您将看到错误声明为未定义。 @Darren 看起来他们最后很甜蜜!

以上是关于使用 cookie 时注销的主要内容,如果未能解决你的问题,请参考以下文章

擦除 websphere 中的 cookie - 如何注销

会话 Cookie,自动注销

注销后 Cookie 会话不会失效

无法在注销时删除 cookie

如何使用php制作涉及会话cookie的注销页面?

在春季安全或角度注销时清除cookie