Cookie与Session
--
在看源码的过程中,发现自己对cookie和session不甚了解。于是便在网上好好看了看这方面的资料。现在记录下来,留作备份。以后忘了还能看...
会话跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie和Session。Cookie通过在客户端记录信息,确定用户身份;Session在服务器端记录信息,确定用户身份
Cookie
http协议是无状态协议,这也就说明了,每个用户在给网站的服务器发送请求后,会建立连接,然后服务器返回信息,然后这个连接就中断了。当用户继续向服务器发送请求的时候,会再次建立连接,这时候服务器不会知道这个用户的信息,这样就会造成不必要的麻烦(比如用户登录之后的操作,比如购物网站的购物车).为了处理这个问题,就发明了cookie.
Cookie是一小段文本信息。当用户第一次请求服务器,并且服务器需要记录用户的状态,服务器就会在response
中发送一个set_cookie
,客户端接收到了之后,会保存这个cookie。当客户端再次请求服务器端的时候,会连同这个cookie一起发送给服务器端。服务器接收到request
之后,会检查cookie
,以此来判断用户的状态。同时,服务器端也能修改用户的cookie
(再次发送set_cookie
,使得客户端覆盖原cookie)
这就好比 一个人(如明明)放学后想回家,但是打不开门,就只好敲门,等妈妈来开门。时间久了,妈妈觉得老给他开门太麻烦,就给了他一把钥匙。这样当他每天放学想回家的时候,只需要拿出钥匙把门打开就可以了。这里面,明明就是客户端,钥匙就是cookie,家就是服务器。
Cookie的属性
cookie主要有以下属性:
- name (名称)
- value (这个name对应的值)
- expires (这个cookie失效的时间)
- domain (可以访问这个cookie的域名)
- path (这个cookie使用的路径,如果设置为/aaa,则只有域名后为/aaa才能访问,如果为/,则表示本域名都能访问)
Session
Session是服务器端使用的一种记录客户端状态的机制,由于存储在服务器上,响应的增加了服务器的存储压力
客户端访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是Session。当客户端再次访问这个服务器的时候,服务器只需要查找到这个session,然后从这个session中查找该客户的状态就可以了
Session保存在服务器端,为了保证访问速度,经常存储在内存中。Session在用户第一次访问服务器的时候自动创建。Session创建后,只要用户继续访问,这个session的最后访问时间就会被更新。随着用户访问的增加,Session的数量也会增加,服务器就会把长时间没活跃的session从内存删除
session需要使用Cookie作为识别标志。因为http协议是无状态的,session无法通过http连接来判断是否是同一个用户。所以服务器会向客户端发送一个SESSIONID的Cookie,这个的值为该session的id,以后客户端访问服务器的时候,会把这个cookie发送给服务器,服务器根据sessionid来查询对应的session。这个cookie是服务器自动生成的,只在当前浏览器内有效,且关闭浏览器就会失效
这就好比 另一个人(小杨)去会员制的酒店吃饭,只有会员才能进去,但是酒店会员太多,无法分辨哪些是会员哪些不是,于是酒店就建立了一个列表,列表里面记载了会员的相关信息和编号,当他人想进入这个酒店的时候,只需要告诉酒店他的编号,酒店核实后再确定能不能让他进入。这里面,小杨就是客户端,酒店就是服务器,列表就是存储了很多session的数据,编号就是SessionID