HTTP协议具有无连接和无状态的特点 在提高效率的同时会让服务器与浏览器变得冰冷 即使以很快的速度连续打开两次网站 服务器依旧无法识别这是同一个客户 所以就需要使用会话技术使浏览器与服务器相识 以及 可以让浏览器访问的不同脚本之间数据共享
会话技术 包括 cookie技术和session技术
cookie技术的实现 :
当浏览器第一次访问一个网站时 请求头中没有cookie信息
当服务器收到请求做出响应时 会在响应头增加一个协议 set-cookie =""
然后浏览器接受到响应以及解析其中的set-cookie协议 得到cookie数据 并将cookie数据保存到浏览器
下次访问该服务器其他脚本的时候(cookie数据还未失效) 就会把cooie数据放在请求头中 传给脚本 脚本就可以识别 这是同一个用户
本质上就是利用浏览器作为踏板 实现不同脚本之间的数据共享实现浏览器与服务器之间是有连接的
通过php代码设置服务器返回的cookie数据
<?php
setcookie('time','201906291633');
//第一个参数为cooie数据的键名 在$_COOKIE数组中 作为索引 第二个参数为cookie数据的值 在$_COOKIE数组中 作为值
?>
在第一次执行这个代码的时候打开调试台 会发现只有响应头中有相应的cookie数据 请求头中不存在cookie数据
当不关闭浏览器 访问其他脚本或再次访问自身脚本时 就会发现请求头中会提交cookie数据
因为打开的这个脚本中没有设置cookie 所有只会在请求头中包含cookie信息 而不会在 响应头中包含信息
cookie存复杂数据
//cookie 存复杂数据 由于setCookie的第二个参数只能是字符传 所以打算存数组信息时 需要在取名时取成数组形式
setcookie('name[]','ada');
setcookie('name[]','bom');
setcookie('name[]','cash');
//这样的话就可以存入数数组形式的数据 在$_COOKIE中 name对应的不是一个值 而是一个数组
cookie 高级应用 可以控制cookie的生命周期以及访问有效性
在控制台查看从cookie时 后面的Expires/Max-age 就是他们的生命周期 默认 session 一次会话 我们可以人为设置一个生命周期
setcookie('seven day','20190706' time()+7*24*3600);//第三个参数 类型为时间戳 其意义是cookie一直可以持续有意义的时间
//当天设定是 从当前的时间开始抑制持续到7天后
执行代码后可以看到 Expries/Max-age 的值是 7.0 day
现在查看浏览器的cookie文件
重启浏览器后查看cookie文件
可以看出我们改变了 sevenday 这个cookie的生命周期 我们可以利用这个特性 来删除cookie数据 只需要把第三个参数改为 1 time()-1 等已经过去的时间戳即可
控制台中有个path属性 当前访问路径 cookie有一个访问路径特性 就是默认 脚本的cookie数据只能同级以及下级
但是在实际开发中 一个网站通常cookie是共享的 所以我们需要把该访问路径设置成根目录
setcookie('anywhere','anywhere',0,"/");//访问路径设置到根目后 文件夹外的脚本 也可以接受到cookie数据
在实际开发中 还有一个cookie跨域共享的问题 cookie默认只能当前网站访问 (域名限定 ) 但实际上 比如在百度页面登陆了信息 那么在百度网盘也会自动登陆 我们依旧可以通过设置来实现跨域共享
setcookie('goout','go out',0,'/','.com');//这意味着 只要是.com结尾的域名都会得到这个cookie
setcookie('goout','go out',0,'/','baidu.com');
//这意味着 只要是baidu.com结尾的域名都会得到这个cookie
//同时控制台中对应cookie 的domin属性 会变成参数设置的字符串 .com baidu.com