【Java Web 系列】Session 的原理分析和使用细节
写在前面😘
大一电子信息工程新生,请多多关照,希望能在 InfoQ 社区记录自己的学习历程!
一、Session 原理分析
Session 是基于 Cookie 实现的
当客户端第一次请求会话对象时,服务器会创建一个 Session 对象,并为该 Session 对象分配一个唯一的 SessionID(用来标识这个 Session 对象);
服务器将 SessionID 以 Cookie(Cookie 名称为:“JSESSIONID”,值为 SessionID 的值,如
Set-Cookie:JESSIONID=10
)的形式发送给客户端浏览器;客户端浏览器再次发送 HTTP 请求时,会将携带 SessionID 的 Cookie (如
cookie: JESSIONID=10
)随请求一起发送给服务器;服务器从请求中读取 SessionID,然后根据 SessionID 找到对应的 Session 对象。
在
同一次会话中
,多次请求获取的是同一个Session对象
注意:
流程中的 Cookie 是容器自动生成的,它的 maxAge 属性取值为 -1,表示仅当前浏览器有效。
浏览器关闭时,对应的 Session 并没有失效,但此时与此 Session 对应的 Cookie 已失效,导致浏览器无法再通过 Cookie 获取服务器端的 Session 对象。
同一浏览器的不同窗口共享同一 Session 对象,但不同浏览器窗口之间不能共享 Session 对象。
二、Session 使用细节
1️⃣Session 钝化与活化
钝化:在服务器正常关闭后,Tomcat 会自动将 Session 数据写入硬盘的文件中
活化:再次启动服务器后,从文件中加载数据到 Session 中
钝化和活化的过程是 Tomcat 自己完成的,不需要我们参与,我们只需要了解下即可
钝化的数据路径为:
项目目录\target\tomcat\work\Tomcat\localhost\项目名称\SESSIONS.ser
数据加载到 Session 中后,路径中的
SESSIONS.ser
文件会被删除掉
2️⃣Session 销毁
Session 对象在服务器中驻留一段时间后没有被使用,就会被销毁,这个时间就是 Session 的过期时间。
Session 的默认过期时间为 30 分钟(默认值是在 Tomcat 的 web.xml 配置文件),我们可以通过如下两种方式设置过期时间。
a.使用 <session-config> 元素
在 web.xml 中,使用
<session-config>
及其子元素<session-timeout>
可以配置 Session 的默认过期时间
<session-timeout> 元素用来指定默认 Session 过期时间,以分钟为单位,该元素值必须为整数。
<session-timeout> 元素的值为零或负数,表示 Session
永远不会过期
。
b.调用 setMaxInactiveInterval() 方法
通过调用 session.setMaxInactiveInterval(int interval) 设置过期时间,以秒为单位,零和负数表示会话永远不会过期,代码如下。
3️⃣Session 生命周期
Session 对象创建
Session 对象在容器第一次
调用 request.getSession() 方法时创建。
值得注意的是,当客户端访问的 Web 资源是 HTML,CSS,图片等静态资源时,服务器不会创建 Session 对象。
Session 对象销毁
Session 对象在如下 3 种情况下会被销毁:
Session 过期;
调用
session.invalidate()
方法,手动销毁 Session;服务器关闭或者应用被卸载。
写在后面🍻
感谢观看啦✨
有什么不足,欢迎指出哦💖
版权声明: 本文为 InfoQ 作者【倔强的牛角】的原创文章。
原文链接:【http://xie.infoq.cn/article/263e447e2fbcb422bca62bc9a】。文章转载请联系作者。
评论