HTTP协议自身属于"无状态"协议,默认情况下HTTP协议的客户端和服务器之间的这次通信和下次通信没有直接的联系.
而在实际的开发中,我们是需要知道请求之间的关系和联系的.例如登录网站后,第二次访问的时候就知道该请求是否已经登录过了.
Cookie和Session的主要目的就是为了弥补HTTP的无状态特性.
基本概念
cookie
- Cookie是HTTP协议中的一个字段,同时也是浏览器在客户端这边保存数据的一种比较古老的一种方式.
- Cookie是服务器产生的,通过HTTP响应的Set-Cookie字段来进行设置返回给浏览器的。Cookie在浏览器这边存储,浏览器会根据域名/地址来分别存储Cookie,并与下一个请求一起发送到服务器,通常,它用于判断两个请求是否来自同一用户,来决定返回什么样的页面。比如不同用户的购物车,游戏得分信息都是不一样的.
- Cookie存的是键值对结构的字符串,此处的键值对都是程序员自定义的.
- 注:Cookie是浏览器这边存储的机制.
Session
像我们去医院看病的时候需要先挂号,挂号的时候会有一张就诊卡,这个就诊卡就相当于患者的"令牌",后续在医院进行一系列开药拍片等操作只需就诊卡就可得出患者的身份信息等一系列信息.
此时在服务器这边就要记录令牌信息,以及令牌对应的用户信息,这故事就是Session机制所做的工作.
服务器同一时刻收到的请求是很多的,而且还需要清楚地区分出不同的请求是从属于哪个用户,就需要在服务器这边记录每个用户令牌以及用户的信息的对应关系;在上面的例子中,就诊卡就是一张 “令牌”。要想让这个令牌能够生效,就需要医院这边通过系统记录每个就诊卡和患者信息之间的关联关系。
- Session本质就是一个"哈希表",存储了一些键值对结构.Key就是令牌的ID(token/sessionId),value就是用户信息(可灵活设计).
- sessionId 是由服务器生成的一个 “唯一性字符串”,从 session机制的角度来看,这个唯一性字符串称为 “sessionId”。但是站在整个登录流程中看待,也可以把这个唯一性字符串称为 “token”.
- sessionId和token可以理解成是同一个东西的不同叫法.(不同视角的叫法)
- 当用户登录的时候,服务器在Session中新增一个记录,并把 sessionId / token 通过Set-Cookie字段返回给客户端.
- 客户端后续再给服务器发送请求的时候,需要在请求中带上 sessionId/ token(例如通过HTTP请求中的 Cookie 字段带上).
- 服务器收到请求之后,根据请求中的sessionId / token在 Session信息中获取到对应的用户信息后再进行后续操作
- Servlet 的Session默认是保存在内存中的,如果重启服务器则Session数据就会丢失.
- 注:Session是在服务器这边储存的机制.
联系
- Cookie和Session之间往往相互配合而不是非得配合.
- Cookie是客户端机制,Session是服务器端的机制.
- 完全可以用Cookie来保存一些数据在客户端,这些数据不一定是用户身份信息,也不一定是token / sessionId
- Session中的 token / sessionId 也不需要非得通过 Cookie / Set-Cookie 传递…