🤖 AI智能摘要
暂未配置
前言
HTTP 协议是无状态协议,服务器不会记住每一个浏览器用户是谁。浏览器访问网页,访问结束之后服务器立刻忘记用户信息。
如果想要记住用户登录状态、保存浏览记录、记住网站设置,就需要用到 Cookie 和 Session。
Cookie 把数据保存在浏览器客户端;Session 把数据保存在服务器端。登录状态几乎全部依靠 Session 来实现。本章学习 Cookie、Session 原理,完成完整登录‑退出登录实战。
一、Cookie 详解
Cookie 是服务器发给浏览器的一小段数据,浏览器会把它保存到本地硬盘。下次浏览器访问同一个网站时,会自动把 Cookie 携带发送给服务器。
1. 设置 Cookie setcookie ()
⚠️注意:setcookie () 必须写在页面任何输出之前,echo、HTML 代码都不能出现在 setcookie 前面,否则直接报错。
<?php
// setcookie(键名,值,过期时间)
// time()+3600 代表1小时之后过期
setcookie("username","admin",time()+3600);
setcookie("nick","管理员",time()+3600*24);
echo "Cookie设置成功";
?>2. 读取 Cookie $\_COOKIE
<?php
if(isset($_COOKIE['username'])){
echo "保存的用户名:".$_COOKIE['username'];
}else{
echo "Cookie不存在";
}
?>3. 删除 Cookie
把过期时间设置为过去的时间,浏览器就会自动销毁 Cookie。
<?php
setcookie("username","",time()-1);
echo "Cookie已经删除";
?>4.Cookie 特点
- 存储在浏览器本地,用户可以查看、修改、删除;
- 不安全,不要存放密码、敏感数据;
- 大小有限制,单个 Cookie 最多 4KB;
- 可以设置有效期,可以长期保存;
- 每次请求网页,浏览器自动携带 Cookie 发送给服务器。
二、Session 会话技术(登录核心)
Session 数据存储在服务器,浏览器只保存一个 Session‑ID。浏览器访问的时候携带 ID,服务器根据 ID 读取对应的数据。
- 优点:数据存在服务器,安全,适合保存登录信息
- 缺点:浏览器关闭之后默认失效(可以通过 Cookie 延长有效期)
⚠️重要:session_start()必须放在页面最顶部,页面输出之前调用,否则报错!1. 开启 session
<?php
session_start();
//存入session
$_SESSION['username'] = "admin";
$_SESSION['nickname'] = "网站管理员";
$_SESSION['isLogin'] = true;
echo "Session写入完成";
?>2. 读取 Session 数据
<?php
session_start();
//判断是否已经登录
if(isset($_SESSION['isLogin']) && $_SESSION['isLogin'] === true){
echo "欢迎,".$_SESSION['nickname'];
}else{
echo "您尚未登录";
}
?>3. 清空单个 Session
<?php
session_start();
unset($_SESSION['nickname']);
?>4. 全部清空 Session、销毁会话(退出登录)
<?php
session_start();
//清空内存当中session数组
$_SESSION = [];
//销毁服务器session文件
session_destroy();
echo "已经退出登录";
?>5.Session 有效期延长
默认关闭浏览器 Session 就消失。如果想要记住登录 7 天,需要配合 Cookie 保存 session\_id。
<?php
//设置session cookie有效期7天
session_set_cookie_params(7*24*3600);
session_start();
?>三、实战:完整登录系统(Session 版)
数据表继续使用上一章 user 表。一共 4 个页面:
- login.html 登录表单
- login.php 登录处理
- index.php 会员中心(需要登录才能访问)
- logout.php 退出登录
1. 登录表单 login.html
<form action="login.php" method="post">
账号:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>2. 登录处理 login.php
<?php
session_start();
$username = trim($_POST["username"]);
$password = trim($_POST["password"]);
if(empty($username) || empty($password)){
echo "账号密码不能为空 <a href='login.html'>返回</a>";
exit;
}
//连接数据库,使用预处理查询,防止SQL注入
$conn = mysqli_connect("127.0.0.1","root","root","php_demo");
mysqli_set_charset($conn,"utf8mb4");
$sql = "SELECT nickname FROM user WHERE username=? AND password=?";
$stmt = mysqli_prepare($conn,$sql);
mysqli_stmt_bind_param($stmt,"ss",$username,$password);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt,$nickname);
mysqli_stmt_fetch($stmt);
if(!empty($nickname)){
//登录成功,写入session
$_SESSION['isLogin'] = true;
$_SESSION['username'] = $username;
$_SESSION['nickname'] = $nickname;
echo "登录成功!<a href='index.php'>进入会员中心</a>";
}else{
echo "账号密码错误!<a href='login.html'>返回</a>";
}
mysqli_stmt_close($stmt);
mysqli_close($conn);
?>3. 会员中心 index.php(登录检测页面)
<?php
session_start();
//没有登录直接跳转到登录页
if(!isset($_SESSION['isLogin']) || $_SESSION['isLogin'] !== true){
header("Location:login.html");
exit;
}
?>
<h2>会员中心</h2>
<p>你好:<?php echo $_SESSION['nickname']; ?></p>
<p>账号:<?php echo $_SESSION['username']; ?></p>
<a href="logout.php">点击退出登录</a>4. 退出登录 logout.php
<?php
session_start();
//清空session
$_SESSION = [];
session_destroy();
//跳转到登录页面
header("Location:login.html");
exit;
?>四、header 页面跳转
header("Location:地址");用于 PHP 服务端跳转。
⚠️header 前面不能有任何输出(echo、空格、HTML 都不行),写完 header 之后必须加上exit;终止后续代码执行。
<?php
header("Location:index.php");
exit;
?>五、Cookie 与 Session 对比总结
| 项目 | Cookie | Session |
|---|---|---|
| 存储位置 | 浏览器客户端 | 服务器端 |
| 安全性 | 低,用户可修改 | 高,用户无法直接修改 |
| 敏感数据 | ❌禁止存放 | ✅适合存放登录信息 |
| 有效期 | 可以自由设置时间 | 默认浏览器关闭失效,可配合 Cookie 延长 |
| 容量 | 最大 4KB | 服务器几乎无限制 |
六、本章总结
- HTTP 是无状态协议,服务器不会记住用户,需要 Cookie、Session 保存状态;
- Cookie 存浏览器,setcookie () 设置,$\_COOKIE 读取;不能存密码等敏感信息;
- Session 存服务器,页面第一行必须 session\_start ();$\_SESSION 读写数据;
- session\_destroy () 用来实现退出登录,彻底销毁会话;
- header () 做页面跳转,跳转后一定要 exit 终止代码;
- 网站登录系统标准流程:表单提交→数据库校验→登录成功写入 Session→页面判断 Session 是否存在。
(注:部分内容可能由 AI 生成)