PHP建站技术分享-从入门到精通_各类知识收集PHP建站技术分享-从入门到精通_各类知识收集PHP建站技术分享-从入门到精通_各类知识收集

QQ:420220301 微信/手机:150-3210-7690
当前位置:首页 > 工作总结

利用php实现一周之内自动登录存储机制(cookie、session、localStorage)

管理员 2025-03-07
工作总结
61

在 PHP 中实现一周之内自动登录的存储机制,通常需要结合 Cookie 和 Session 来实现。localStorage 是前端技术(JavaScript),不能直接用于 PHP,但可以通过与前端交互来实现类似功能。

以下是实现自动登录的步骤和代码示例:


实现思路

  1. 用户登录时

    • 验证用户名和密码。

    • 如果用户选择“自动登录”,生成一个唯一的令牌(Token),并将其存储到数据库和 Cookie 中。

    • 将用户信息存储到 Session 中。

  2. 用户再次访问时

    • 检查是否存在自动登录的 Cookie。

    • 如果存在,验证 Cookie 中的令牌是否与数据库中的令牌匹配。

    • 如果匹配,自动登录用户并将用户信息存储到 Session 中。

  3. 安全性

    • 令牌应该是唯一的、随机的,并且与用户关联。

    • 使用 HTTPS 保护 Cookie 和令牌的传输。


数据库设计

假设我们有一个 users 表和一个 user_tokens 表:

sql
复制
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    password VARCHAR(255) NOT NULL);CREATE TABLE user_tokens (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    token VARCHAR(255) NOT NULL,
    expires_at DATETIME NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(id));

实现代码

1. 用户登录并设置自动登录

php
复制
<?phpsession_start();// 数据库连接$host = 'localhost';$dbname = 'your_database';$user = 'root';$pass = '';$conn = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);// 用户登录if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['login'])) {
    $username = $_POST['username'];
    $password = $_POST['password'];
    $remember = isset($_POST['remember']); // 是否选择“自动登录”

    // 查询用户
    $stmt = $conn->prepare("SELECT * FROM users WHERE username = :username");
    $stmt->execute(['username' => $username]);
    $user = $stmt->fetch(PDO::FETCH_ASSOC);

    // 验证密码
    if ($user && password_verify($password, $user['password'])) {
        // 登录成功,设置 Session
        $_SESSION['user_id'] = $user['id'];

        // 如果选择“自动登录”,设置 Cookie 和 Token
        if ($remember) {
            $token = bin2hex(random_bytes(32)); // 生成随机令牌
            $expires = time() + 7 * 24 * 60 * 60; // 一周后过期

            // 将令牌存储到数据库
            $stmt = $conn->prepare("INSERT INTO user_tokens (user_id, token, expires_at) VALUES (:user_id, :token, :expires_at)");
            $stmt->execute([
                'user_id' => $user['id'],
                'token' => $token,
                'expires_at' => date('Y-m-d H:i:s', $expires)
            ]);

            // 设置 Cookie
            setcookie('remember_token', $token, $expires, '/');
        }

        echo "登录成功!";
    } else {
        echo "用户名或密码错误!";
    }}?><!-- 登录表单 --><form method="POST">
    <input type="text" name="username" placeholder="用户名" required>
    <input type="password" name="password" placeholder="密码" required>
    <label>
        <input type="checkbox" name="remember"> 自动登录    </label>
    <button type="submit" name="login">登录</button></form>

2. 自动登录验证

在每次页面加载时,检查是否存在自动登录的 Cookie,并验证令牌。

php
复制
<?phpsession_start();// 数据库连接$host = 'localhost';$dbname = 'your_database';$user = 'root';$pass = '';$conn = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);// 检查用户是否已登录if (!isset($_SESSION['user_id'])) {
    // 检查是否存在自动登录的 Cookie
    if (isset($_COOKIE['remember_token'])) {
        $token = $_COOKIE['remember_token'];

        // 查询令牌
        $stmt = $conn->prepare("SELECT user_id FROM user_tokens WHERE token = :token AND expires_at > NOW()");
        $stmt->execute(['token' => $token]);
        $tokenData = $stmt->fetch(PDO::FETCH_ASSOC);

        if ($tokenData) {
            // 令牌有效,自动登录用户
            $_SESSION['user_id'] = $tokenData['user_id'];
            echo "自动登录成功!";
        } else {
            // 令牌无效,清除 Cookie
            setcookie('remember_token', '', time() - 3600, '/');
            echo "自动登录失效,请重新登录。";
        }
    }}// 检查用户是否已登录if (isset($_SESSION['user_id'])) {
    echo "用户已登录,用户ID: " . $_SESSION['user_id'];} else {
    echo "用户未登录。";}?>

3. 用户注销

在用户注销时,清除 Session 和 Cookie。

php
复制
<?phpsession_start();// 清除 Sessionsession_destroy();// 清除自动登录的 Cookieif (isset($_COOKIE['remember_token'])) {
    setcookie('remember_token', '', time() - 3600, '/');}echo "注销成功!";?>

结合 localStorage(前端)

localStorage 是前端技术,不能直接用于 PHP,但可以通过 JavaScript 与 PHP 交互。例如,将令牌存储到 localStorage 中,并在每次请求时发送给服务器。

示例代码

html
复制
<script>// 将令牌存储到 localStorage
localStorage.setItem('remember_token', 'your_token_here');

// 从 localStorage 获取令牌并发送到服务器
const token = localStorage.getItem('remember_token');
if (token) {
    fetch('/auto_login.php', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({ token: token })
    })
    .then(response => response.json())
    .then(data => {
        console.log(data);
    });
}</script>

在服务器端(auto_login.php)处理令牌验证。


总结

通过结合 Cookie 和 Session,可以实现一周之内自动登录的功能。localStorage 可以用于前端存储令牌,但需要与后端配合使用。务必注意安全性,避免令牌泄露或被滥用。




希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, LeCMS, ClassCMS, Fastadmin, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。

相关推荐

扫码关注

qrcode

QQ交谈

回顶部