首先在了解session机制前,我们先搞懂什么是会话?
会话对应的英语单词:session
用户打开浏览器,进行一系列操作,然后最终将浏览器关闭,这一整个过程叫做一次会话。会话在服务器端会生成一个对象,这个对象就是session对象。一次会话中包含多次请求。
session对象的主要作用就是:保存会话状态。
那么为什么要用session对象保存会话状态呢?
因为HTTP协议是一种无状态协议,可以理解为在一次请求中,浏览器与服务器是处于连接状态,但是当请求结束后,这种连接就会断开。当初设计这种协议的目的就是为了降低服务器端的压力,你试想一下如果连接不断开的话,随着用户的请求不断增加,没有释放连接,服务器就会冒烟。而且当我们关闭浏览器时(断开连接)服务器是不知道这件事的。
session的底层实现原理:
当我们使用session机制时,也就是当我们在servlet类中有这么一段代码时(HttpSession session=request.getSession),服务器就会创建一个session对象,其对应有一个域,称之为"会话域",我们从请求中得到的数据就放在这个域中,这里要区分的是还有两个域,“请求域”和“应用域”,不要搞混了,他们的大小关系为应用域>会话域>请求域。当我们创建了这个session对象后与之同时还生成了一个东西,这个东西叫做JSESSIONID就是一个session对象的id(本质上是cookie),服务器就会将这个JSESSIONID传回给浏览器,一般存储在浏览器的运行内存中和硬盘软件中,在下一次请求中,就会带着这个JSESSIONID一起到服务器,进行session对象的匹配,关闭浏览器结束对话时就会这个cookie销毁,session销毁(实际上并没有马上销毁,只不过是session对象有一个生命周期,生命周期结束自动销毁罢了)
总结:session就是一个存储于服务器的对象,通过session可以实现数据共享,session有一个JSESSIONID,这个是session的唯一标识,使用它可以查找到session。session是会话级别的,对于每一个客户端来说是独享它所拥有的session的,我们使用session在进行页面跳转时,服务端可以利用session进行数据共享。session由服务器进行控制。session的创建和销毁都是服务器进行管理的。服务器会为每一个客户端创建一个session。
详情可以看这篇文章: