zoukankan      html  css  js  c++  java
  • 关闭浏览器session就被干掉的假象的问题

    当在前台取出session时,关闭浏览器后再次访问服务器,这时服务器返回了一个null,此时的返回的session并非之前的那个session而是一个新的session。

    -->先来看看session的生命周期:

      创建:当getSession()后,session就被创建。

      结束:有三种结束生命的情况 >>

            1.服务器会默认一个30分钟的生命时间值,若在这个期间,为被访问服务器时就会自动结束生命;

              |--可以在服务器下的web.xml文件中的 <session-timeout> 30 </session-timeout> 修改这是默认值,是以分为单位。

            2.session自杀: 调用session.invalidate()方法可以立即杀死session;

            3.服务器意外关闭。(服务器正常关闭时session是会被服务器保存在服务器的 session.ser 文件中(在work文件夹下))

    --> 当关闭浏览器时怎么就会有session干掉的假象呢?

      由于session是基于Cookie的。浏览器发起请求会携带sessionId到服务器,服务器根据这个id来判读当前访问的是哪个session。

      然而浏览器被关闭后由于浏览器的Cookie文件还未设置MaxAge值,所以在此时浏览器的Cookie是会话级别的,是存在浏览器的内存中,当浏览器被关闭浏览器的内存被释放,临时文件被清除,这时的Cookie也随之销毁,则当前这个请求中被没有之前的那个sessionId值,服务器就当时第一次访问,给浏览器创建一个新的session值并返回一个null;

      但是之前的那个session并没有被干掉,只是浏览器找不到这个sessionId了。这样一来,此时服务器器就存在了两个session了。

    -->解决这个假象的方案

       我们可以创建一个新的CooKie,该Cookie的名字为jsession,path为WEB应用的虚拟路径,并设置setMaxAge()的毫秒值,让Cookie保存在客户端的硬盘中,这时即使多次对浏览器进行关开操作是不会清楚客户端硬盘文件的。所以,Cookie就不丢失了,SessionId也不会随浏览器关闭而丢失。

      具体代码实现:

        Cookie cookie = new Cookie("JSESSIONID", session.getId());
               cookie.setPath(request.getContextPath()+"/");
               cookie.setMaxAge(30*60);
               response.addCookie(cookie);

  • 相关阅读:
    LeetCode Missing Number (简单题)
    LeetCode Valid Anagram (简单题)
    LeetCode Single Number III (xor)
    LeetCode Best Time to Buy and Sell Stock II (简单题)
    LeetCode Move Zeroes (简单题)
    LeetCode Add Digits (规律题)
    DependencyProperty深入浅出
    SQL Server存储机制二
    WPF自定义RoutedEvent事件示例代码
    ViewModel命令ICommand对象定义
  • 原文地址:https://www.cnblogs.com/tongxuping/p/6914065.html
Copyright © 2011-2022 走看看