1、Session的工作原理及出现
当我们用浏览器打开一个网页,用到的是HTTP协议,而这个协议它是无状态的,什么是无状态呢?就是说这一次请求和上一次请求是没有任何关系的,互不认识的,没有关联的。但是这种无状态的的好处是快速。
然而我们希望访问的两个页面或更多页面之间有关联,就比如我们要访问一个网站,当我们进入登录页面的时候是一个http请求,而登录之后又是一个http请求,而这两个请求都是无状态,两者之间没有关联,我们希望在登录之后登录页面中也能读取到已经登录了,但不推荐。
前面讲过cookie的存储特点,我们知道cookie 是存在用户端,而且它本身存储的尺寸大小也有限,最关键是用户可以是可见的,并可以随意的修改,很不安全。那如何又要安全,又可以方便的全局读取信息呢?于是,这个时候,一种新的存储会话机制:session 诞生了。
2、Session作用
从上面的描述来讲,它的作用就是在一次会话中解决2次HTTP的请求的关联,让它们产生联系,让2两个页面都能读取到找个这个全局的session信息。session信息存在于服务器端,所以也就很好的解决了安全问题。
3、标识会话JSESSIONID
Session 既然是为了标识一次会话,那么此次会话就应该有一个唯一的标志,这个标志就是sessionId。
每当一次请求到达服务器,如果开启了会话(访问了 session),服务器第一步会查看是否从客户端回传一个名为 JSESSION 的 cookie,如果没有则认为这是一次新的会话,会创建一个新的 session 对象,并用唯一的 sessionId 为此次会话做一个标志。如果有 JESSIONID 这个 cookie 回传,服务器则会根据 JSESSIONID 这个值去查看是否含有 id 为 JSESSION 值的 session 对象,如果没有则认为是一个新的会话,重新创建一个新的 session 对象,并标志此次会话;如果找到了相应的 session 对象,则认为是之前标志过的一次会话,返回该 session 对象,数据达到共享。
这里提到一个叫做 JSESSION 的 cookie,这是一个比较特殊的 cookie,当用户请求服务器时,如果访问了 session,则服务器会创建一个名为 JSESSION,值为获取到的 session(无论是获取到的还是新创建的)的 sessionId 的 cookie 对象,并添加到 response 对象中,响应给客户端,有效时间为关闭浏览器。
所以 Session 的底层依赖 Cookie 来实现。
4、Session作为域对象
Session 用来表示一次会话,在一次会话中数据是可以共享的
域对象三个数据操作方法:
setAttribute(String key,Object value) 向域对象中添加数据
getAttribute(String key) 从域对象中获取数据
removeAttribute(String key) 从域对象中移除数据
数据存储在 session 域对象中,当 session 对象不存在了,或者是两个不同的 session 对 象时,数据也就不能共享了
5、 session的 创建:由服务器创建和管理的
6、获取session的方式
// 获取Session对象
HttpSession session = request.getSession();
7、session的销毁
a、服务器默认为30分钟不活动就销毁session,当用户访问服务器的时候相当于活动时间,会重新计时。
b、自定义最大不活动时间,单位为秒
// 设置最大不活动时间 单位为s
session.setMaxInactiveInterval(10);
c、立即销毁
session.invalidate();
获取session对象然后立即销毁
request.getSession().invalidate();
d、关闭浏览器
当我们关闭浏览器时,JSESSIONID会被销毁,从而导致session也会失效,但是服务器中被销毁的JSESSIONID对应的session对象还在,需要经过默认时间才会被销毁。
e、关闭服务器
正常关闭:服务器会将session序列化到本地磁盘,(Tomcat目录下的work下会产生一个SESSIONS.ser)
存在session中的对象的实体类需要实现序列化接口,implements Serializable
非正常关闭:服务器中的所有session对象都会被销毁