【问题标题】:logging out a user completely from a website [duplicate]从网站完全注销用户[重复]
【发布时间】:2013-04-29 06:51:34
【问题描述】:

我有一个PHP login 并注销脚本,我想要实现的是,当用户点击注销链接时,他完全注销,无论点击浏览器的后退按钮,并且不想要用户访问页面。他们应该被重定向到login页面

这是登录功能

function loggedin() {
    if ( isset($_SESSION['user_id']) && !empty($_SESSION['user_id']) ) {
        return true;
    } else{
        return false;
    }
}

这是我的注销脚本

<?php
include 'includes/connect.php';
include 'includes/functions.php';

session_destroy();
header('location: index.php');

?>

我怎样才能做到这一点??

【问题讨论】:

  • 当用户访问一个页面时,检查是否设置了session。如果没有设置会话,将他重定向到登录页面。
  • 这取决于您要如何实现。例如,在您的问题中,根本没有定义什么构成登录。你需要澄清一下,否则它只是猜测。
  • 您是在询问“如何在 PHP 中销毁会话”?也许stackoverflow.com/questions/3113223/…? - 到目前为止,您对我们现场已有的许多现有材料进行了哪些尝试?请参考并明确哪个部分具体不适用于您。如果您还没有尝试过任何现有的解决方案,请立即尝试。

标签: php session


【解决方案1】:

您可以编写一个通用函数来检查用户是否已登录,如果不只是像这样重定向他们

function isLoggedIn(){

    if (isset($_SESSION['user_id']) && !empty($_SESSION['user_id'])){

        //do what you want

    } else{
        header("location:youloginpage.php");

    }
}

【讨论】:

    【解决方案2】:

    您可以删除所有cookies

    if (isset($_SERVER['HTTP_COOKIE'])) {
        $cookies = explode(';', $_SERVER['HTTP_COOKIE']);
        foreach($cookies as $cookie) {
            $parts = explode('=', $cookie);
            $name = trim($parts[0]);
            setcookie($name, '', time()-1000);
            setcookie($name, '', time()-1000, '/');
        }
    }
    

    http://www.php.net/manual/en/function.setcookie.php#73484

    如果您有一个用于登录身份验证的 cookie 名称数组,您应该只使用它们来迭代循环。

    【讨论】:

    • 我应该把它放在我的注销脚本中
    【解决方案3】:

    问题是从网站上完全注销用户,而不仅仅是如何销毁 PHP 会话,所以我的答案会稍微复杂一些。

    由于您使用 PHP 的 $_SESSION 功能来处理用户会话,因此您尤其可以将当前会话 ID 绑定到用户帐户。然后您可以轻松地强制会话过期。

    比如在用户数据库中新建一个字段,命名为active_session_id什么的。每次用户登录时,将session_id() 输出保存到其中。然后在您的loggedin() 函数内部检查当前请求的session_id() 是否与用户登录时保存的匹配,如果不匹配,该函数将返回 false,所以这就是您虚拟结束的方式用户会话。 IE。即使它实际上仍然存在,但它不再有效。

    值得注意的是,上述解决方案类似于one-to-one 关系,即一个用户将只能拥有一个活动会话。如果您想允许用户同时来自不同的地方,您必须通过创建一个名为例如的新表来维护one-to-many 关系。 users_sessions 并将会话 ID 保存在那里。请不要在当前用户表中创建其他字段,例如 active_session_id_1active_session_id_2 等,因为这不是一种好的做法。

    希望对你有帮助

    【讨论】:

      【解决方案4】:

      如果您没有详细说明您的问题,我们只能通过假设进行。无论如何,由于您正在使用该 SESSION,并且不清楚您是否要销毁包含的数据,因此检查用户是否已登录的功能可以这样修改:

      function loggedin() {
          if ( isset($_SESSION['user_id']) && is_numeric($_SESSION['user_id']) && ($_SESSION['user_id'] > 0) ) {
              return true; //user is logged in
              //other operations to be performed
          } else{
              return false; //user is NOT logged in
              //other operations to be performed
          }
      }
      

      注销功能可能是这样的:

      function logout() {
          if ( isset($_SESSION['user_id']) && is_numeric($_SESSION['user_id']) && ($_SESSION['user_id'] > 0) ) {
              $_SESSION['user_id'] = -1; //"unsets" the user, while not destroyng session
          } else{
              return false; //user is already logged out - do nothing
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-25
        • 2014-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-21
        • 1970-01-01
        相关资源
        最近更新 更多