• Session使用细节 [JavaWeb][Servlet]


    Session使用细节

    Session钝化,活化

    钝化: 在服务器正常关闭后, tomcat服务器会自动将Session数据写入到硬盘的文件中

    • 会将Session对象进行一个序列化, 转换为一个session.ser文件, 存储到当前项目之下的target文件夹中

    活化: 再次启动服务器后, 从文件中加载数据反序列化为对应的Session对象

    • 活化之后会将对应的序列化文件session.ser文件从硬盘中删除掉

    那么服务器重启之后, Session中的数据是否还存在?

    1. 如果服务器正常关闭之后重启, Session中的是数据还是存在的, 因为Session会先钝化然后活化
      • 但是注意: 服务器重启之后已经是一次新的会话了, 因为当建立会话之后如果客户端或者服务器中有一方断开的时候会话就会终止, 但是此时我们正常关闭的时候Session对象会进行一个钝化然后保存到服务器本地内存中, 当我们再次重启服务器之后Session对象又会经历一次活化, 也就是进行一个反序列化, 从而就能获取到关闭服务器之前的会话中的Session中的数据
    2. 如果服务器异常关闭之后, 重启服务器之后, Session中的数据会消失, 因为服务器异常结束时不会进行一个钝化, 没有钝化, 那么也就没有将Session对象序列化之后存储到服务器本地中, 也就自然不能进行活化了

    那么如果是客户端浏览器关闭之后重新打开, Session中的数据是否还存在?

    不存在了, 当客户端浏览器重启的时候Session并不会执行钝化, 也不会执行活化, 并且当浏览器关闭之后会话就会消失, 当我们重新打开浏览器的时候其实是一次新的会话, 当会话结束的时候Session对象就会随着客户段浏览器的关闭而关闭

    • 因为Session是通过Cookie实现的, 所以当客户端浏览器关闭之后Cookie就会失效, 那么当浏览器再次请求的时候就是一次新的请求, 对应的传输过去的时候就会是一个新的SessionID值, 那么原本的Session对象就获取不到了
      • 所以如果浏览器关闭之后Session对象并没有失效, 而是获取不到了(因为是新的会话)

    Session销毁

    1. 默认情况之下,无操作30分钟之后自动销毁

      • 这个默认时间是在内置的web.xml文件中配置好的

      • 我们也可以在项目中的web.xml文件中进行一个再次配置

        • eg:

        • <session-config>
              <session-timeout>40</session-timeout>
          </session-config>
          
          • 1
          • 2
          • 3
          • 这个时候其实就是将Session设置为了当无操作40分钟之后自动删除
    2. 使用Session对象调用invalidate()方法

      • 也就是我们的Session对象是可以自己结束自己的, 我们登陆到一个网站中,如果要退出网站的时候就要通过Session对象调用invalidate()方法来将Session对象销毁掉
        • 也就是要删除登陆之后网站中的Session数据

    注意: 如果Session对象被销毁之后还使用Session对象来获取Session对象中保存的数据的时候就会报出一个服务器错误(状态码: 500)

    • HTTP Status 500-getAttributes : Session already invalidated
      • 上面就是我们使用invalidate()方法删除了Session对象之后还使用Session对象来调用了getAttributes()方法想要获取到Session中保存的数据

    补充:

    我们可以发现如果创建了Session对象之后使用ctrl + c命令关闭服务器的时候会比较慢, 这个时候其实就是在将我们的Session中的数据序列化之后保存到本地保存到当前项目的target文件夹之下

    补充二:

    Session对象默认会在关闭服务器的时候进行序列化之后将Session对象以SESSION.ser文件的形式保存下来, 但是注意: 序列化SESSION对象的时候只是将这个对象和这个Session对象的属性序列化了, 但是我们通过setAttribute()方法向Session对象中存储的数据是不会被序列化的, 所以如果我们的服务器关闭之后Session对象会被序列化, 当服务器在不超时的情况之下重启的时候就会进行反序列化得到Session对象, 得到了Session对象之后其中的JSESSIONID的值还是关闭服务器之前的Session对象的JSESSIONID值, 但是由于我们通过setAttribute()方法设置的数据并没有被序列化, 所以最终我们反序列化之后的Session对象中就是没有上一次我们通过setAttribute()方法设置的值的

    • 也就时我们SESSION对象序列化的时候只是序列化了Session对象和Session对象的属性值, 但是并没有序列化我们通过setAttribute()方法设置的内容

    补充三:

    如果你希望你的web工程的默认Session的超时时长为其他时长, 你可以在你自己的web.xml配置文件中作以下配置:

    <session-config>
        <session-timeout>20</session-timeout>
    </session-config>
    
    • 1
    • 2
    • 3
    • 如上就是将web工程中的默认Session的超时时长设置为了20分钟
    • 这种方式设置之后只要是当前web工程中的Session对象, 那么超时时长都将是20分钟

    如果你只想修改个别的Session的超时时长, 就可以使用Session对象调用setMaxInactiveInterval(int Interval)方法来进行单独设置

    session.setMaxInactiveInterval(30)
    
    • 1
    • 如果参数值为负数的时候就表示永远都不会超时(极少使用)
      • 因为如果将Session对象设置为永不超时之后即使客户端断开也罢 , 或者是服务器重启也罢, Session对象其实都没有被销毁, 就会导致大量的Session对象在服务器内存中积累, 就会导致服务器内存占用过高

    Session超时指的是: 如果在指定的时间内浏览器都没有向服务器发送请求,那么在指定的时间之内没有使用到这个Session对象,这个时候Session对象就会超时, 超时之后就会被销毁

    注意: Session的超时时长负数不是默认值, 默认值是30, 负数表示的是永远都不会超时

    • 有的时候负数只是为了和作为一个正数的相反含义, 这个时候往往默认值都是正数, 就好像我们的某个方法是返回索引, 这个时候索引是从0开始的, 所以我们就用返回-1来表示我们找不到对应位置一样

    补充:

    Session对象的生命周期:

    Session对象创建, 在一次会话的某次请求中服务器端代码中第一次调用getSession()方法时

    Session对象销毁:

    1. 在服务器关闭的时候(其实这个时候Session对象严格意义上讲是没有销毁的, 只是钝化了)
    2. 在执行的时间内如果没有使用到创建的Session对象
      • tomcat服务器中默认是30分钟, 可以通过setMaxInactiveInterval()方法来设置
    3. 手动关闭 , 调用invalidate()方法

    单词积累:

    Inactive : 不活跃的

    interval : 间隔

    • MaxInactiveInterval: 最大不活跃间隔

    invalidate : 使无效

  • 相关阅读:
    查找总价格为目标值的两个商品 ---- 双指针
    【Java对象实例与文件之间互转】
    MPEG算法及代码例程
    Mybatis+Servlet+Mysql 整合的一个小项目:对初学者非常友好,有助于初学者很快的上手Java Web
    Java学习笔记 --- Java绘图技术
    使用JAVA-api读取HDFS下文件内容,出现报错信息
    LeetCode 每日一题 2022/8/1-2022/8/7
    Vue ——08、路由嵌套,参数传递及重定向
    一文搞定Linux信号
    使用visual stdio中自带git无法推送代码的问题解决
  • 原文地址:https://blog.csdn.net/m0_57001006/article/details/125551111