php - 不能让用户像“Facebook”一样长时间登录
问题描述
我做了一个网站,可以让你像 Facebook 一样长时间登录来制作这个系统 我使用了 cookie,我在 1 年后到期,我做了一个检查 cookie 的功能,但有些用户被踢出,我不知道为什么这是检查令牌和 cookie 的代码 我使用令牌并将其保存在我的数据库中
public static function checkToken($conn) {
//header('Location: login.php');
if (isset($_COOKIE['token']) && isset($_COOKIE['username'])) {
//$_SESSION['username'] =$_COOKIE['username'];
//$_SESSION['token'] = $_COOKIE['token'];
$username = $_COOKIE['username'];
$query = $conn->prepare("select * from session where username =?");
$query->execute([$username]);
if ($query->rowCount() > 0) {
$rows = $query->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $row) {
$token1 = $row['session'];
$gent = $row['agent'];
}
if ($_COOKIE['token'] != $token1) {
// session_destroy();
header("Location: /login");
// set the expiration date to one hour ago
setcookie('token', null);
setcookie('username', null);
exit;
}
} elseif ($query->rowCount() == 0) {
// session_destroy();
header("Location: /login");
// set the expiration date to one hour ago
setcookie('token', null);
setcookie('username', null);
exit;
}
} else {
// session_destroy();
header("Location: /login");
// set the expiration date to one hour ago
setcookie('token', null);
setcookie('username', null);
exit;
}
}
这用于登录
public static function login($conn) {
$user = filter_var($_POST['username'], FILTER_SANITIZE_STRING);
$pass = filter_var($_POST['password'], FILTER_SANITIZE_STRING);
$query = $conn->prepare("select * from users where username= ? and password = ?");
$query->execute([$user, $pass]);
if ($query->rowCount() > 0) {
$rows = $query->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $row) {
$username = $row['username'];
}
$token = funcs::getToken(10);
$_SESSION['token'] = $token;
setcookie('token', $token, time() + (365 * 24 * 60 * 60));
setcookie('username', $username, time() + (365 * 24 * 60 * 60));
//setcookie('year', $_SESSION['year'], time() + ( 365 * 24 * 60 * 60) );
//setcookie('pre', $_SESSION['pre'], time() + ( 365 * 24 * 60 * 60) );
$gettoken = $conn->prepare("select * from session where username= ? ");
$gettoken->execute([$_COOKIE['username']]);
if ($gettoken->rowCount() == 0) {
$query1 = $conn->prepare("insert into session (username,session,agent)values(?,?,?)");
$query1->execute([$user, $_COOKIE['token'], $_SERVER['HTTP_USER_AGENT']]);
} else {
header('Location: /index');
exit;
}
header('Location: /index');
exit;
ob_end_flush();
}
return true;
}
解决方案
推荐阅读
- eclipse - 在 Eclipse 中找不到 mvn 命令,但可以在终端上使用
- tensorflow - 两个连续图像的 tf.keras 损失
- jdbc - 如何使用 JDBC Driver 连接 GCP 存储桶
- debugging - 为什么 Juno 调试器会尝试在某个随机目录中搜索文件?
- javascript - 表单中的复选框验证
- apache-spark - 获取所有崩溃的 Spark Yarn Job 日志
- c - 构建 make 文件 arm 微控制器
- python - 使用 Pandas 的 DateTimeIndex 上的值计数从每个月中选择前 5 个
- laravel - 覆盖 BackpackForLaravel 中的翻译
- unity3d - 从用户操作中检测游戏对象移除