【Java Web 系列】Session的原理分析和使用细节

633 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情

写在前面😘

大一电子信息工程新生,请多多关照,希望能在掘金记录自己的学习历程!

一、Session原理分析

Session是基于Cookie实现的

image-20220601225348134

  1. 当客户端第一次请求会话对象时,服务器会创建一个 Session 对象,并为该 Session 对象分配一个唯一的 SessionID(用来标识这个 Session 对象);
  2. 服务器将 SessionID 以 Cookie(Cookie 名称为:“JSESSIONID”,值为 SessionID 的值,如Set-Cookie:JESSIONID=10)的形式发送给客户端浏览器;
  3. 客户端浏览器再次发送 HTTP 请求时,会将携带 SessionID 的 Cookie (如cookie: JESSIONID=10)随请求一起发送给服务器;
  4. 服务器从请求中读取 SessionID,然后根据 SessionID 找到对应的 Session 对象。
  • 同一次会话中,多次请求获取的是同一个Session对象

image-20220506102546218

注意

  • 流程中的 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 的默认过期时间
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--设置session的过期时间-->
    <session-config>
        <!--单位:分钟-->
        <session-timeout>100</session-timeout>
    </session-config>
</web-app>
  • 元素用来指定默认 Session 过期时间,以分钟为单位,该元素值必须为整数
  • 元素的值为零或负数,表示 Session 永远不会过期

b.调用 setMaxInactiveInterval() 方法

通过调用 session.setMaxInactiveInterval(int interval) 设置过期时间,以秒为单位,零和负数表示会话永远不会过期,代码如下。

//设置会话的过期时间,单位:秒
request.getSession().setMaxInactiveInterval(100);

3️⃣Session生命周期

Session 对象创建

Session 对象在容器第一次调用 request.getSession() 方法时创建。

值得注意的是,当客户端访问的 Web 资源是 HTML,CSS,图片等静态资源时,服务器不会创建 Session 对象。

Session 对象销毁

Session 对象在如下 3 种情况下会被销毁:

  • Session 过期;
  • 调用 session.invalidate() 方法,手动销毁 Session;
  • 服务器关闭或者应用被卸载。

写在后面🍻

感谢观看啦✨
有什么不足,欢迎指出哦💖
掘金的运营同学审核辛苦了💗