Appearance
第 10 章:会话控制(登录状态)
10.1 Cookie 原理与使用
Cookie 基本概念
Cookie 是存储在用户浏览器中的小型文本文件,用于存储用户信息和状态。
Cookie 的工作原理
- 服务器通过 HTTP 响应头
Set-Cookie向浏览器发送 Cookie - 浏览器将 Cookie 存储在本地
- 当用户再次访问服务器时,浏览器通过 HTTP 请求头
Cookie将 Cookie 发送回服务器 - 服务器根据 Cookie 中的信息识别用户
设置 Cookie
php
<?php
// 设置 Cookie
setcookie('username', '张三', time() + 3600, '/');
// 设置带过期时间的 Cookie
$expire = time() + 3600; // 1 小时后过期
setcookie('user_id', '123', $expire, '/', '', false, true); // 最后一个参数为 true 表示只在 HTTPS 下传输
?>读取 Cookie
php
<?php
// 读取 Cookie
$username = $_COOKIE['username'] ?? '';
echo "用户名:$username";
// 检查 Cookie 是否存在
if (isset($_COOKIE['user_id'])) {
echo "用户 ID:" . $_COOKIE['user_id'];
}
?>删除 Cookie
php
<?php
// 删除 Cookie(设置过期时间为过去的时间)
setcookie('username', '', time() - 3600, '/');
?>10.2 Session 原理与使用
Session 基本概念
Session 是存储在服务器端的用户会话数据,用于跟踪用户状态。
Session 的工作原理
- 服务器为每个用户创建一个唯一的 Session ID
- 服务器将 Session ID 通过 Cookie 发送给浏览器
- 浏览器在后续请求中携带 Session ID
- 服务器根据 Session ID 找到对应的会话数据
启动 Session
php
<?php
// 启动 Session
session_start();
// 存储 Session 数据
$_SESSION['username'] = '张三';
$_SESSION['user_id'] = 123;
?>读取 Session 数据
php
<?php
// 启动 Session
session_start();
// 读取 Session 数据
$username = $_SESSION['username'] ?? '';
$user_id = $_SESSION['user_id'] ?? '';
echo "用户名:$username";
echo "用户 ID:$user_id";
?>删除 Session 数据
php
<?php
// 启动 Session
session_start();
// 删除单个 Session 变量
unset($_SESSION['username']);
// 清空所有 Session 数据
$_SESSION = [];
// 销毁 Session
session_destroy();
?>10.3 登录与退出逻辑
登录逻辑
php
<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 接收数据
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';
// 验证用户(实际应用中会查询数据库)
if ($username === 'admin' && $password === '123456') {
// 登录成功,存储用户信息到 Session
$_SESSION['username'] = $username;
$_SESSION['user_id'] = 1;
$_SESSION['is_logged_in'] = true;
// 跳转到首页
header('Location: index.php');
exit;
} else {
$error = "用户名或密码错误";
}
}
?>退出逻辑
php
<?php
session_start();
// 清空 Session 数据
$_SESSION = [];
// 销毁 Session
session_destroy();
// 跳转到登录页
header('Location: login.php');
exit;
?>10.4 登录状态判断
检查登录状态
php
<?php
session_start();
// 检查是否登录
if (!isset($_SESSION['is_logged_in']) || !$_SESSION['is_logged_in']) {
// 未登录,跳转到登录页
header('Location: login.php');
exit;
}
// 已登录,显示用户信息
echo "欢迎," . $_SESSION['username'] . "!";
echo "<a href='logout.php'>退出登录</a>";
?>示例:受保护的页面
php
<?php
// protect.php
session_start();
// 检查登录状态
if (!isset($_SESSION['is_logged_in']) || !$_SESSION['is_logged_in']) {
header('Location: login.php');
exit;
}
// 页面内容
echo "<h1>受保护的页面</h1>";
echo "欢迎," . $_SESSION['username'] . "!";
echo "<p>这是只有登录用户才能访问的页面</p>";
echo "<a href='logout.php'>退出登录</a>";
?>10.5 实操:用户登录系统
创建 login.php 文件
php
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户登录</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 20px;
}
.form-container {
width: 300px;
margin: 0 auto;
padding: 20px;
border: 1px solid #ccc;
border-radius: 5px;
background-color: #f9f9f9;
}
input {
width: 100%;
padding: 10px;
margin: 5px 0;
box-sizing: border-box;
}
button {
width: 100%;
padding: 10px;
margin: 10px 0;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 3px;
cursor: pointer;
}
button:hover {
background-color: #45a049;
}
.error {
color: red;
font-size: 12px;
}
</style>
</head>
<body>
<h1>用户登录</h1>
<div class="form-container">
<?php
session_start();
// 检查是否已登录
if (isset($_SESSION['is_logged_in']) && $_SESSION['is_logged_in']) {
header('Location: index.php');
exit;
}
$error = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 接收数据
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';
// 验证用户(实际应用中会查询数据库)
if ($username === 'admin' && $password === '123456') {
// 登录成功,存储用户信息到 Session
$_SESSION['username'] = $username;
$_SESSION['user_id'] = 1;
$_SESSION['is_logged_in'] = true;
// 跳转到首页
header('Location: index.php');
exit;
} else {
$error = "用户名或密码错误";
}
}
// 显示错误
if (!empty($error)) {
echo '<p class="error">' . $error . '</p>';
}
?>
<form method="post">
<input type="text" name="username" placeholder="用户名" value="<?php echo htmlspecialchars($_POST['username'] ?? '', ENT_QUOTES, 'UTF-8'); ?>"><br>
<input type="password" name="password" placeholder="密码"><br>
<button type="submit">登录</button>
</form>
</div>
</body>
</html>创建 index.php 文件
php
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>首页</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 20px;
}
.welcome {
float: right;
}
</style>
</head>
<body>
<?php
session_start();
// 检查登录状态
if (isset($_SESSION['is_logged_in']) && $_SESSION['is_logged_in']) {
echo '<div class="welcome">';
echo '欢迎,' . $_SESSION['username'] . '!';
echo ' <a href="logout.php">退出登录</a>';
echo '</div>';
} else {
echo '<div class="welcome">';
echo '<a href="login.php">登录</a>';
echo '</div>';
}
?>
<h1>首页</h1>
<p>这是网站首页</p>
<?php
if (isset($_SESSION['is_logged_in']) && $_SESSION['is_logged_in']) {
echo '<p><a href="dashboard.php">进入控制面板</a></p>';
} else {
echo '<p>请登录后访问控制面板</p>';
}
?>
</body>
</html>创建 dashboard.php 文件
php
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>控制面板</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 20px;
}
.welcome {
float: right;
}
</style>
</head>
<body>
<?php
session_start();
// 检查登录状态
if (!isset($_SESSION['is_logged_in']) || !$_SESSION['is_logged_in']) {
header('Location: login.php');
exit;
}
echo '<div class="welcome">';
echo '欢迎,' . $_SESSION['username'] . '!';
echo ' <a href="logout.php">退出登录</a>';
echo '</div>';
?>
<h1>控制面板</h1>
<p>这是用户控制面板,只有登录用户才能访问</p>
<p>用户 ID:<?php echo $_SESSION['user_id']; ?></p>
<p>用户名:<?php echo $_SESSION['username']; ?></p>
<p><a href="index.php">返回首页</a></p>
</body>
</html>创建 logout.php 文件
php
<?php
session_start();
// 清空 Session 数据
$_SESSION = [];
// 销毁 Session
session_destroy();
// 跳转到登录页
header('Location: login.php');
exit;
?>访问页面
- 将文件保存到网站根目录
- 打开浏览器,访问
http://localhost/login.php - 使用用户名
admin和密码123456登录 - 测试登录、退出和访问受保护页面的功能
小结
通过本章的学习,你掌握了 PHP 的会话控制技术,包括 Cookie 和 Session 的原理与使用。你还学习了如何实现用户登录、退出逻辑以及登录状态判断。会话控制是 Web 应用中非常重要的功能,它允许服务器跟踪用户的登录状态和会话数据,为用户提供个性化的体验。在后续的学习中,你将经常使用这些技术来实现用户认证和授权功能。
