1.无状态的HTTP
我们知道同一个连接两次请求之间没有必然的关系,那么试想一下如果我们需要某些页面(不同请求)关联起来相互作用,即可以共享一些数据,那么通过无状态HTTP我们就无法做到。但是,虽然HTTP本身的核心是无状态,但HTTP cookie允许使用有状态会话。
2.cookie是什么
一个HTTP cookie的(网络Cookie,浏览器cookie)是一小片数据的一个服务器发送到用户的网络浏览器。浏览器可以存储它并将其与下一个请求一起发送回同一服务器。通常,它用于判断两个请求是否来自同一个浏览器 - 例如,保持用户登录。它记住无状态 HTTP协议的有状态信息。
3.session是什么
客户端请求服务端,服务端(Tomcat)会为这次请求开辟一块内存空间,这个对象便是Session对象, 存储结构为ConcurrentHashMap(同步的Map集合,以键值对信息存储数据)。
session的目的:弥补HTTP无状态特性,服务器可以利用session存储客户端在同一个会话期间的一些操作记录。比如,我们在玩一些网页游戏的时候,登录上账号之后,我们在不同的游戏之间切换,但是我们依旧是登录状态。
4.session的实现机制
首先我们怎么判断客户端发送来的请求属于同一个会话?答案是:session id,如果session id相同那么认为是同一个对话,在tomcat中session id用JSESESSIONID表示。
服务器第一次接收到请求时,开辟了一块Session空间(创建了Session对象),同时生成一个Session id,并通过响应头的Set-Cookie:“JSESSIONID=XXXXXXX”命令,向客户端发送要求设置cookie的响应; 客户端收到响应后,在本机客户端设置了一个JSESSIONID=XXXXXXX的cookie信息,该cookie的过期时间为浏览器会话结束;
接下来客户端每次向同一个网站发送请求时,请求头都会带上该cookie信息(包含Session id); 然后,服务器通过读取请求头中的Cookie信息,获取名称为JSESSIONID的值,得到此次请求的Session id;
注意:服务器只会在客户端第一次请求响应的时候,在响应头上添加Set-Cookie:“JSESSIONID=XXXXXXX”信息,接下来在同一个会话的第二第三次响应头里,是不会添加Set- Cookie:“JSESSIONID=XXXXXXX”信息的; 而客户端是会在每次请求头的cookie中带上JSESSIONID信息;当然还可以通过隐藏表单、URL末尾附加ID来追踪Session。这些机制很少使用,最常用的Session机制仍然是Cookie。