服务器通过HTTP响应头Set-Cookie
来告诉用户代理cookie的名、值、对应的路径、有效期等等,用户代理(一般就是浏览器)保存下来后,当向后端请求数据时,就会把对应的cookie放到请求头中发给服务器。
前端也可以通过JS来设置cookie。
所以只要设置好cookie之后,浏览器会自动在请求时附上cookie,并不需要你主动提交。
PHP中设置Cookie的函数是setcookie
(还有个setrawcookie
并不常用)。
setcookie('hello','world',time()+3600,'/test/','example.com');
这样就设置了一个名为hello
值为world
,有效期为当前时间加上3600秒(也就是1个小时),域名为example.com
,路径为/test/
(代表只能在诸如http://example.com/test/a.php
这样的路径下有效)的cookie。
具体参数请参考文档
服务器会在响应的HTTP头中包含一个Set-Cookie
头:
Set-Cookie:hello=world;Expires=Sun,13Nov201611:30:00GMT;Domain=example.com;Path=/test/
其中过期时间(Expires
)是使用GMT来表示,这里我假设我是在北京时间2016年11月13日18:30:00(也就是GMT2016年11月13日10:30:00)设置的Cookie,有效期是1个小时。
如果有多个cookie就会有多个Set-Cookie
头。
具体可参考
浏览器就会把这个Cookie保存下来。当下次你再请求符合Cookie条件的地址时,浏览器就会在请求头中包含一个Cookie
头:
Cookie:hello=world
如果有多个cookie还是只有一个Cookie
头,各个cookie的名值对使用分号和空格;
来分隔。
不管你是AJAX请求,还是普通的POST和GET,只要cookie有效,浏览器就会发送给服务器。
PHP会解析头信息,并把cookie解析到$_COOKIE
数组中。我们就可以这样访问名为hello
的cookie的值:
$_COOKIE['hello'];
JS中访问cookie有点麻烦,因为并没有方便的接口来读取、设置cookie。我们只能通过document.cookie
来操作cookie。具体请参考:
JS中读取cookie直接用document.cookie
,但是得到的确实和上面浏览器发送cookie中的格式类似的字符串,就是用分号和空格隔开的名值对。
比如hello=world;PHPSESSID=web5~toqn2au0krlholat9c2c4aast3
这样的。我们需要自己解析。
JS中设置cookie则是和上面服务器发送cookie类似,都要设置各个参数。比如:
document.cookie="hello=kitty;expires=Sun,13Nov201612:00:00GMT"
这样就把hello
的值改成了kitty
,并且把过期时间延长了半个小时。
虽然看起来好像修改了document.cookie
整个值,但实际上并不会影响到其他cookie。我们再次访问document.cookie
将得到hello=kitty;PHPSESSID=web5~toqn2au0krlholat9c2c4aast3
这样的结果。
要删除一个cookie,只要把过期时间设置在当前时间之前就行了。
因为HTTP
设计是无状态的,所以就有了cookie
来充当HTTP
的状态。有了cookie
,服务端就知道,你是谁了。php
有setcookie
函数,还有$_COOKIE
来获取cookie
。cookie
是通过头部字段Cookies
和Set-Cookie
来传递的。所以php
也可以使用设置返回头和读取返回头来设置cookie
和读取cookie
。