首先HTTP协议是一种无状态的协议,即服务器无法判断用户的身份
一个http请求大致分为三步:
1.客户端浏览器发送请求给服务器
2.服务器处理该请求
3.服务器将处理结果响应给客户端浏览器
之后该客户端再次向该服务器发送请求后,服务器端并不能知道这两个请求是否是同一个浏览器或用户发送出来的。
所以作为服务器必须能够采用某种方式来唯一识别同一个用户,并记录该用户的状态。
而这同一个客户端与服务器端的在一段时间内的多次交互,我们就可以称该客户端为该服务器端的一个客户端会话窗口,有了会话窗口,我们就能确定哪个请求是哪个用户发出的了,从而可以实现会话跟踪,并记录用户的行为。
当用户第一次访问并登录一个网站的时候,cookie的机制经历以下4个步骤:
1.客户端发送一个请求到服务器
2.服务器发送一个HttpResponse响应到客户端,其中包含Set-Cookie的头部(用于将cookie返回给浏览器)
3.客户端保存cookie,之后向服务器发送请求时,HttpRequest请求中会携带cookie
4.服务器返回响应数据
① cookie机制采用的是在客户端保存HTTP状态信息的方案
② 每一个cookie都有一个name和一个value,且name是唯一的。相同名字时,后者会覆盖掉前者
③ 一个web浏览器可以存储多个web站点提供的cookie,浏览器一般只允许存放300个cookie,每个站点最多存放20个cookie,每个cookie的大小限制为4KB
(1) 会话级的cookie
默认情况下它是一个会话级别的cookie,存储在浏览器的内存中,用户退出浏览器之后被删除
(2) 持久化的cookie
若希望浏览器将该cookie存储在磁盘上,则需要设置该cookie的生命周期setMaxAge,并给出一个以秒为单位的时间,将最大时效设为0则是命令浏览器删除该cookie
cookie的domain和path属性定义了cookie的作用范围,即访问哪些网站或url时,会自动的带着该cookie。domain即域名,默认是当前主机(不包括子域名),path默认是*(所有路径),即域名后面的路径,大部分情况下我们都是使用默认的设置即可。
session机制采用的是在服务器端保持HTTP状态信息的方案。
为了加速session的读取和存储,服务器中会开辟一块内存用来保存服务器端所有的session,每个session都会有一个唯一标识session id,根据客户端传过来的jsession id(cookie中),找到对应的服务器端的session。
为了防止服务器端的session过多导致内存溢出,服务器默认会给每个session设置一个有效期(30分钟),若有效期内客户端没有访问过该session,服务器就认为该客户端已离线并删除该session。
1. 当用户发送一个请求到服务器时,服务器会先检查请求中是否含有session id(存在cookie中或者在url中)
2. 如果不存在sessionid(说明是第一次请求),就会为该请求用户创建一个session对象,并将该session对象的sessionid响应给客户端 (sessionid放到响应头的set-cookie中,格式set-cookie:sessionid,下次再请求时cookie中就会有一个name为jsessionid的cookie,value就是sessionid)
3. 如果存在sessionid,就会在服务器端查找是否有该sessionid对应的session,如果有就使用,没有就创建一个
① cookie中
通过一个特殊的cookie,name为JSESSIONID,value为服务器端某个 session的ID,默认的方式。但是当浏览器禁用cookie后session就会失效。
② url重写
当浏览器Cookie被禁时用。
就是把session的id附加在URL路径的后面。附加的方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面。
token是服务器端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可
Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮
解决了session依赖于单个服务器的问题
① 用设备号/设备mac地址作为Token(推荐)
② 用session值作为Token
cookie数据存放在客户端上,session数据放在服务器上;
cookie不是很安全,且保存数据有限;
session一定时间内保存在服务器上,当访问增多,占用服务器性能
作为身份认证,token安全性比session好;
Cookie是不允许垮域访问的,但是token是支持的, 前提是传输的用户认证信息通过HTTP头传输;
token就是令牌,比如你授权(登录)一个程序时,他就是个依据,判断你是否已经授权该软件;cookie就是写在客户端的一个txt文件,里面包括你登录信息之类的,这样你下次在登录某个网站,就会自动调用cookie自动登录用户名;
session和cookie差不多,只是session是写在服务器端的文件,也需要在客户端写入cookie文件,但是文件里是你的浏览器编号Session的状态是存储在服务器端,客户端只有session id;
而Token的状态是存储在客户端。