Session 的细节


一、当客户端关闭后,服务器不关闭,两次获取Session是否为同一个?

答:在默认情况下,不是同一个。如果需要两个Session相同,则可以创建一个Cookie对象,键位JSESSIONID,设置一下最大存活时间,让Cookie持久化保存SessionID,就可以实现客户端关闭,两次获取Session是同一个了。

下面演示一下:

@WebServlet("/sessionDemo3")
public class SessionDemo3 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //获取HttpSession对象
        HttpSession session = request.getSession();
        System.out.println(session);

        //期望客户端关闭之后,session也能相同
        Cookie cookie = new Cookie("JSESSIONID",session.getId());
        cookie.setMaxAge(60 * 10); //设置cookie存活时间为十分钟
        response.addCookie(cookie); //发送cookie
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request, response);
    }
}

运行服务器,打开浏览器访问该Servlet之后,关闭浏览器,再次访问,控制台输出结果如下:
在这里插入图片描述

二、客户端不关闭,服务器关闭后,两次获取的Session是同一个吗?

答:不是同一个,但是为了确保数据不丢失,tomcat自动完成了下面这两个工作:

  • session的钝化:在服务器正常关闭之前,将session对象序列化到硬盘上
  • session的活化:在服务器启动后,将session文件转化为内存中的session对象

这样就完成了数据的不丢失,tomcat帮助我们完成上面的工作,但是,IDEA不能!

至于为什么Tomcat可以完成这个工作呢?我们新写两个Servlet,一个用于session存储数据,一个用于获取session数据并打印(代码简单,不再粘贴)

然后把该项目在out文件夹下生成的项目压缩一下,打包为以.war为后缀名的文件,然后把他拷贝在Tomcat目录下的webapps目录下:
在这里插入图片描述
运行Tomcat,打开一个浏览器,访问发送sessionServlet,然后访问接收sessionServlet,可以看到控制台打印出了hello
在这里插入图片描述
OK,现在我们让Tomcat正常关闭(shutdown.bat),关闭之后,Tomcat开始执行钝化操作。

它把Session序列化到了:apache-tomcat-8.5.61\work\Catalina\localhost\SessionDemo文件夹下:
在这里插入图片描述
重启Tomcat,即执行活化操作,上面的这个保存序列号的文件也会被自动删除,紧接着,我们访问接收信息的Servlet
在这里插入图片描述
控制台输出了hello!成功!

三、Session什么时候被销毁?

Session在服务器关闭后被销毁,如果打开一个页面,在一定时间内不动电脑,Session也会被销毁

如果我们期望session可以存活时间久一点,我们可以到tomcat\conf\web.xml文件下,找到:

  <!-- ==================== Default Session Configuration ================= -->
  <!-- You can set the default session timeout (in minutes) for all newly   -->
  <!-- created sessions by modifying the value below.                       -->

    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

这段代码,更改那个30就好了,这个30就是默认的30分钟。

猜你喜欢

转载自blog.csdn.net/lesileqin/article/details/112688141