Appearance
10.1 Cookie 原理与使用
Cookie 是存储在用户浏览器中的小型文本文件,用于跟踪用户状态和存储用户偏好设置。
Cookie 的原理
- 服务器通过 HTTP 响应头
Set-Cookie向浏览器发送 Cookie - 浏览器将 Cookie 存储在本地
- 当用户访问同一网站时,浏览器通过 HTTP 请求头
Cookie将 Cookie 发送回服务器 - 服务器根据 Cookie 中的信息识别用户
Cookie 的特点
- 存储在客户端浏览器中
- 大小限制约为 4KB
- 可以设置过期时间
- 可以设置域名和路径
- 可以设置是否仅在 HTTPS 连接中发送
示例代码
设置 Cookie
php
<?php
// 设置简单的 Cookie
setcookie('username', '张三', time() + 3600, '/');
// 设置带有更多选项的 Cookie
setcookie('user_id', '12345', time() + 86400, '/', 'example.com', true, true);
// 设置 Cookie 数组
setcookie('user[name]', '张三', time() + 3600, '/');
setcookie('user[age]', '18', time() + 3600, '/');
// 显示设置结果
echo "Cookie 设置成功!<br>";
?>读取 Cookie
php
<?php
// 读取单个 Cookie
if (isset($_COOKIE['username'])) {
echo "欢迎回来," . $_COOKIE['username'] . "!<br>";
} else {
echo "首次访问,欢迎!<br>";
}
// 读取 Cookie 数组
if (isset($_COOKIE['user'])) {
echo "姓名: " . $_COOKIE['user']['name'] . "<br>";
echo "年龄: " . $_COOKIE['user']['age'] . "<br>";
}
// 显示所有 Cookie
echo "<h3>所有 Cookie:</h3>";
print_r($_COOKIE);
?>删除 Cookie
php
<?php
// 删除 Cookie(将过期时间设置为过去的时间)
setcookie('username', '', time() - 3600, '/');
setcookie('user_id', '', time() - 3600, '/', 'example.com', true, true);
setcookie('user[name]', '', time() - 3600, '/');
setcookie('user[age]', '', time() - 3600, '/');
echo "Cookie 删除成功!<br>";
?>实际应用示例
php
<?php
// 记录用户访问次数
if (isset($_COOKIE['visit_count'])) {
$visitCount = $_COOKIE['visit_count'] + 1;
} else {
$visitCount = 1;
}
// 更新 Cookie
setcookie('visit_count', $visitCount, time() + 365 * 24 * 3600, '/');
// 显示访问次数
echo "这是您第 " . $visitCount . " 次访问本网站!<br>";
// 记住用户选择的语言
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['language'])) {
$language = $_POST['language'];
setcookie('language', $language, time() + 365 * 24 * 3600, '/');
echo "语言设置已保存!<br>";
} else if (isset($_COOKIE['language'])) {
$language = $_COOKIE['language'];
echo "您上次选择的语言是: $language<br>";
} else {
$language = 'zh-CN';
}
?>
<form action="" method="post">
<label>选择语言:
<select name="language">
<option value="zh-CN" <?php echo $language === 'zh-CN' ? 'selected' : ''; ?>>中文</option>
<option value="en-US" <?php echo $language === 'en-US' ? 'selected' : ''; ?>>English</option>
</select>
</label>
<input type="submit" value="保存">
</form>注意事项
- 安全性:Cookie 存储在客户端,可能被篡改,不要存储敏感信息
- 大小限制:每个 Cookie 大小限制约为 4KB,总数限制约为 50 个
- 过期时间:如果不设置过期时间,Cookie 会在浏览器关闭后消失
- 路径和域名:合理设置路径和域名,控制 Cookie 的作用范围
- HTTPS:对于敏感信息,应设置
secure参数,仅在 HTTPS 连接中发送 - HttpOnly:设置
httponly参数,防止 JavaScript 访问 Cookie,减少 XSS 攻击风险
练习
- 创建一个使用 Cookie 记录用户偏好设置的页面
- 实现一个简单的购物车,使用 Cookie 存储商品信息
- 测试 Cookie 的过期时间和作用范围
