HTTP 很重要的一个特点就是 无状态(每一次见面都是“初次见面”),如果单纯的希望通过我们的服务端程序去记
住每一个访问者是不可能的,所以必须借助一些手段或者说技巧让服务端记住客户端,这种手段就是 Cookie。

Cookie 就像是在超级市场买东西拿到的小票,由超市(Server)发给消费者(Browser),超市方面不用记住每
一个消费者的脸,但是他们认识消费者手里的小票(Cookie),可以通过小票知道消费者之前的一些消费信息(在
服务端产生的数据)。
1.1. PHP 中操作 Cookie
// 设置 cookie
setcookie("TestCookie", "hello", time() + 1 * 60 * 60); /* 1 小时过期 */
// 获取 cookie
echo $_COOKIE["TestCookie"];
============================================================
-
Session
由于 Cookie 是服务端下发给客户端 由客户端本地保存的。换而言之客户端可以在本地对其随意操作,包括删除和
修改。如果客户端随意伪造一个 Cookie 的话,对于服务端是无法辨别的,就会造成服务端被蒙蔽,构成安全隐
患。
于是乎就有了另外一种基于 Cookie 基础之上的手段:Session:
image.png
Session 区别于 Cookie 一个很大的地方就是:Session 数据存在了服务端,而 Cookie 存在了客户端本地,存在服
务端最大的优势就是,不是用户想怎么改就怎么改了。
Session 这种机制会更加适合于存放一些属于用户而又不能让用户修改的数据,因为客户端不再保存具体的数据,
只是保存一把“钥匙”,伪造一把可以用的钥匙,可能性是极低的,所以不需要在意。
image.png
<?php
// 设置响应头中的 Set-Cookie 可以下发小票(给客户端发)
// Cookie 在客户端存储的是键值结构
// header('Set-Cookie: foo=bar');
// header 在设置相同的键时 会出现覆盖的情况
// header('Foo: 123');
// header('Foo: 456');
// setcookie 是专门用于设置 cookie 的函数
// setcookie('key', 'value');
// 只传递一个参数是删除
// 原理:设置过期时间为一个过去时间
setcookie('key');
// 传递两个参数是设置 cookie
setcookie('key1', 'value1');
// 传递第三个参数是设置过期时间
// 不传递就是 会话级别的 Cookie (关闭浏览器就自动删除)
setcookie('key2', 'value2', time() + 1 * 24 * 60 * 60);
setcookie('key3', 'value3', time() + 1 * 24 * 60 * 60, '/users');
setcookie('key4', 'value4', time() + 1 * 24 * 60 * 60, '', '', false, true);
<?php
// 专门取 cookie
// 关联数组的方式访问客户端提交过来的 Cookie
var_dump($_COOKIE);
<?php
// 给当前用户找一个属于他的箱子(没有箱子开箱子,有箱子找已有的箱子)
session_start();
$_SESSION['key1'] = 'value1';
<?php
// 给当前用户找一个属于他的箱子(没有箱子开箱子,有箱子找已有的箱子)
session_start();
var_dump($_SESSION);
===========================================================
关闭广告案例:
<?php
if (isset($_GET['action']) && $_GET['action'] === 'close-ad') {
// 不想看到广告
setcookie('hide_ad', '1');
$_COOKIE['hide_ad'] === '1';
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.ad {
height: 200px;
background-color: #ff0;
}
.ad a {
float: right;
}
</style>
</head>
<body>
<?php if (empty($_COOKIE['hide_ad']) || $_COOKIE['hide_ad'] !== '1'): ?>
<div class="ad">
<!-- <a href="close.php">不再显示</a> -->
<a href="index.php?action=close-ad">不再显示</a>
</div>
<?php endif ?>
</body>
</html>
关闭页面:
<?php
// 只要有人来请求我,意味着这个人不想再看到广告
// 我们给这个用户开张票
setcookie('hide_ad', '1');
header('Location: index.php');
网友评论