Cookie和Session
HTTP协议是一种无状态协议,即每次服务端接手到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录;Session和Cookie的主要目的就是为了弥补HTTP的无状态特性。
Session
1 | 客户端请求服务端,服务端会为这次请求开辟了一块内存空间,这个对象便是Session对象,存储结构为ConcurrentHashMap。 |
Session如何判断是否是同一个会话
1 | 服务器第一次接收到请求,开辟了一块Session空间(创建了Session对象),同时生成一个sessionId,并通过响应头的 Set-Cookie: JSESSIONID=xxxx 命令,向客户端发送要求设置Cookie的响应; |
1 | 接下来客户端每次向同一个网站发送请求时,请求头都会带上Cookie信息(包含sessionId),服务器通过读取请求头中的Cookie信息,获取名称为JSESSIONID的值,得到此请求的sessionId |
Session的缺点
1 | 比如A服务器存储了Session,就是做了负载均衡后,假如一段时间内A的访问量激增,会转发到B进行访问。 |
Cookies是什么
1 | HTTP协议中的Cookie包括Web Cookie和浏览器Cookie,它是服务器发送到Web浏览器的一小块数据。 |
Cookie主要下面3个目的
- 会话管理
1 | 登录、购物车、游戏得分或者服务器应该记住的其他内容 |
个性化
1
用户偏好、主题或者其他设置
追踪
1
记录和分析用户行为
创建Cookie
1 | 当接收到客户端发出的 HTTP 请求时,服务器可以发送带有响应的 Set-Cookie标头。 |
1 | 有两种类型的 Cookies,一种是 Session Cookies,一种是 Persistent Cookies,如果 Cookie 不包含到期日期,则将其视为会话 Cookie。 |
会话Cookies
1 | 创建的是会话Cookie有个特征,客户端关闭时Cookie会删除,因为它没有指定Expires或 Max-Age 指令。 |
永久性Cookies
1 | 永久性Cookie不会在客户端关闭时过期,而是在特定日期(Expires)或特定时间长度(Max-Age)外过期 |