第十一章:第12节 PHP与MySQL——PHP实现会员管理(六)COOKIE的基本操作

更新于:2017-10-13 19:22:53

Cookie基本操作


服务器可操作浏览器的COOKIE数据(增删改操作),主要依靠setcookie函数。


1.png


参数:


name”为cookie的名字,

value”为cookie的值,

expire”为过期时间的秒级时间戳(默认为0,关闭浏览器即失效。如果数字小于当前时间戳,代表删掉一个cookie。只要有效期还没到,关闭浏览器也不受影响。)

path”为cookie的路径,浏览器在发送cookie是只会发送对应路径及祖先级路径的cookie,如cookieA设置在根下,cookieB设置在/dir/下,访问dir的请求会带着cookieB和cookieA,但访问根路径的请求只会带着cookieA

domain”为cookie的域名,只能设置为当前域或当前域的上级域。例如:一个在a.b.com的页面,可以设置domain为a.b.com,b.com,设置为a.b.com只能在a.b.com中访问cookie,若直接设置为b.com,则可以在其他b.com域下访问

secure”为true会对cookie进行HTTPS加密传输

httponly”为true时,只能通过请求发送cookie,使用javascript无法读取httponly的cookie,安全性更高


下面做演示:


1.png


1)打开浏览器的开发者工具(F12)。在1.PHP下暂时没有“响应cookie”(Response Cookies)。“响应cookie”是指服务器向浏览器写cookie数据。

Request Cookies是“请求cookie”,指浏览器向服务器提交cookie数据。图上的两个cookie值我们不用去管。


1.png


2)向浏览器写入两个cookie数据,cookie1有效期默认是当关闭浏览器时结束,cookie2有效期为10秒。


1.png


3)刷新页面后,“响应cookie”里有了cookie1和cookie2。(因为输入的是汉字,直接转成了unicode编码)。在开发者工具里可以看到“响应cookie”的有效期。cookie1 session指的会话,意思是浏览器关闭就算会话结束。cookie2 那显示的是到期时间。


1.png


4)把cookie1和cookie2注释掉,待会刷新页面看看效果。同时往浏览器写入新的“响应cookie” cookie3,并设1小时有效时间。


1.png


5)刷新页面后,“响应cookie” cookie3正常写入浏览器。而“请求cookie”呢,cookie1正常由浏览器发往服务器。而cookie2却没了,10秒的时间早已过去,所以浏览器不再把过期的cookie发往服务器。


1.png


6)访问同一域名下其他页面(哪怕是一个静态页面),浏览器也会把“请求cookie”发往服务器,除非为cookie设置了path,不然访问同一域名下的任何页面都会发送“请求cookie”。


1.png


7)假如说,不把16、17行代码注释,再刷新页面


1.png


8)cookie1、cookie3等于是做了一次修改,cookie2等于是重新往浏览器写入的新cookie数据。


1.png


9)只要把有效期的时间戳小于当前时间戳,就等于删除了一个cookie数据。


1.png


10)刷新两次页面,第二次cookie1彻底从请求cookie中删除了。


说明下:


a.com域名写到浏览器的cookie1数据(当前域是a.com),b.com域名写到浏览器的cookie2数据(当前域是b.com)。当用户再次访问a.com下任何页面时,浏览器只会把cookie1数据发送给a.com服务器,不会把cookie2数据发给a.com服务器。不是a.com域名下的cookie浏览器不会乱发给服务器,不然的话整个网络就不安全了。


同样a.com服务器往浏览器写入cookie数据时,cookie数据的当前域只能是a.com下的二级域名,不能是其他域名,比如不能是b.com。


1.png


11)cookie4,把当前域设为“baidu.com”


1.png


12)连续刷新两次,可见“请求cookie”里依然没有cookie4,那去百度下看看有没有这个cookie。


1.png


13)想都不要想,根本不可能有的。所以第11步19行代码是没有任何意义的代码。


setcookie函数“secure”参数设置说明:


为TRUE时:该cookie只能在HTTPS通道下被写入浏览器。也就是http下不写到浏览器。

为FALSE时,该cookie既可以在HTTPS也可以在HTTP通道下被写入浏览器。本身https是在http上做的扩展,能https访问同时也支持http访问。使坏的人可能会从http下获取cookie从而知道https下的cookie。


注意:在使用setcookie函数前是不能有任何输出的(指的是可以在页面显示的输出),和header函数一样。


cookie的读操作:


PHP对cookie的增删改操作全靠setcookie一个函数搞定。那PHP怎么读cookie呢?


还记得前面学习PHP预定义变量时,楠神说有两个非常重要的放到后面讲。没错,读取浏览器发送的cookie直接可用预定义变量$_COOKIE


1.png


1.png


和其他预定义变量一样,返回的是数组。$_COOKIE只获取“请求cookie”,不获取“响应cookie”。


注意下:初学的朋友会犯这样的错误。


1.png


这样并不能修改浏览器的cookie数据。


重要的一点:


保存在浏览器的cookie不支持共享。什么意思呢?同一台电脑上,IE浏览器上cookie火狐浏览器获取不到。各浏览器的cookie存储都是独立的,如果你发现有两种浏览器cookie是共享的,那绝对是有一个浏览器使用的别的浏览器内核。


比如市面上IE、火狐、Google Chrome都是自主开发的浏览器,像360、搜狗浏览器都是基于别的浏览器内核二次开发的浏览器。


本节学习代码》》》