HTTP 会话
1. Cookie
HTTP 很重要的一个特点就是无状态(每一次见面都是“初次见面”),如果单纯的希望通过我们的服务端程序去记住每一个访问者是不可能的,所以必须借助一些手段或者说技巧让服务端记住客户端,这种手段就是 Cookie。
Cookie 就像是在超级市场买东西拿到的小票,由超市(Server)发给消费者(Browser),超市方面不用记住每一个消费者的脸,但是他们认识消费者手里的小票(Cookie),可以通过小票知道消费者之前的一些消费信息(在服务端产生的数据)。
Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie。内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。所以,按存在时间,可分为非持久Cookie和持久Cookie。
1.1.Cookie属性
一般cookie所具有的属性,包括:
Domain:域,表示当前cookie所属于哪个域或子域下面。
对于服务器返回的Set-Cookie中,如果没有指定Domain的值,那么其Domain的值是默认为当前所提交的http的请求所对应的主域名的。比如访问 http://www.example.com,返回一个cookie,没有指名domain值,那么其为值为默认的www.example.com。
Path:表示cookie的所属路径。
Expire time/Max-age:表示了cookie的有效期。expire的值,是一个时间,过了这个时间,该cookie就失效了。或者是用max-age指定当前cookie是在多长时间之后而失效。如果服务器返回的一个cookie,没有指定其expire time,那么表明此cookie有效期只是当前的session,即是session cookie,当前session会话结束后,就过期了。对应的,当关闭(浏览器中)该页面的时候,此cookie就应该被浏览器所删除了。
secure:表示该cookie只能用https传输。一般用于包含认证信息的- cookie,要求传输此cookie的时候,必须用https传输。
httponly:表示此cookie必须用于http或https传输。这意味着,浏览器脚本,比如javascript中,是不允许访问操作此cookie的。
比如百度的Cookie:
1.2. PHP 中操作 Cookie
http://php.net/manual/zh/function.setcookie.php
// 设置 cookie /* 1 小时过期 */ setcookie("TestCookie", "hello", time() + 1 * 60 * 60); // 获取 cookie echo $_COOKIE["TestCookie"];
1.2.1. 记住登录名案例
登录功能实现流程
1.2.2.PHP设置cookie
是给本网站域名的http设置cookie
setcookie('key', 'value',‘time’);
- 只传递一个参数是删除
原理:设置过期时间为一个过去时间
- 传递两个参数是设置 cookie
- 传递第三个参数是设置过期时间
<?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);
1.2.3.PHP获取cookie
即上文创建的cookie
<?php // 专门取 cookie // 关联数组的方式访问客户端提交过来的 Cookie var_dump($_COOKIE);
1.3. JavaScript 中操作 Cookie
1.3.1. Pure JavaScript
参考:http://www.runoob.com/js/js-cookies.html
// 新增一条 cookie,注意:cookie 是有大小限制,约为 4k // 格式固定:<key>=<value>[; expires=<GMT格式时间>][; path=<作用路径>][; domain=<作用域名>] // 除了键值以外其余属性均有默认值,可以省略 // expires 表示 cookie 失效的时间,默认为关闭浏览器时 // path 表示 cookie 生效的路径,默认为当路径 // / /foo.php /abc/foo.php // /foo /bar/abc.php // domain 表示 cookie 生效的域名,默认为当前域名 document.cookie = 'name=value; expires=Tue, 10 Oct 2017 16:14:47 GMT; path=/; domain=zce.me' // 获取全部 cookie console.log(document.cookie) // => 'key1=value1; key2=value2' // 得到的结果是字符串,需要自己通过字符串操作解析
1.3.2. jQuery plugin
https://github.com/carhartl/jquery-cookie
1.3.3. without jQuery
https://github.com/js-cookie/js-cookie
2.Cookie案例:广告去除
点击不在显示,就会修改cookie值,使广告永远不显示
close.php
<?php // 只要有人来请求我,意味着这个人不想再看到广告 // 我们给这个用户开张票 setcookie('hide_ad', '1'); header('Location: index.php');
index.php
<?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: skyblue; } .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>
3.Cookie案例:猜数字游戏
文章地址: