Session创建时间:误解与真相,及测试中的疑问

问题:session什么时候被创建?

Session创建时间:误解与真相,及测试中的疑问

常见的错误是认为 session 在有客户端访问时就会被创建。但实际上,是直到某 server 端程序(比如……)才会创建 session。

当调用 Servlet 中的 HttpServletRequest.getSession(true)这样的语句时,会话才会被创建。

在浏览资料博客的时候,都能够看到上面这句话。我一直感到疑惑,因为我的代码中并没有。

HttpServletRequest.getSession(true),为何会创建 session 呢?以下是相关测试。

新建了一个web项目 test

一 、 能获取session

单独运行 jsp index.jsp ,并且 jsp 网页默认包含 page 指令 。

在 Tomcat 服务器运行 index.jsp 时,能够在 tomcat 的以下目录找到 index.jsp 编译后的 Java 文件 index_jsp.java。打开该 Java 文件,就可以看到 session = pageContext.getSession() 。

获取创建session

// index_jsp.java 中创建 session
session = pageContext.getSession();
// 类似以下两种写法
// 1 、创建一个新的session
session = request.getSession(true);
如果有就获取现有的 session,要是没有就创建一个新的 session。
session = request.getSession();

运行首次后,返回了 JSESSIONID ,这表明已经创建了 session 。

刷新网页 创建两个session 但路径不同

综上两点而言,session 要到 session = pageContext.getSession(); 这个时候才会创建对象。

二、不能获取session

添加 index.jsp 后,需关闭浏览器的所有窗口,或者关闭浏览器进程,因为若不这样做,之前测试的 sessionid 会在浏览器进程中保留,从而无法得到预期结果。

服务器未返回 JSESSIONID ,这表明没有创建 session 。

打开index_jsp.java文件

可以看到在里面没有发现 创建session的语句

Session 会结束其生命周期,同时也可以设置 session 的过期时间。

Session.invalidate() 这个方法,在实际开发中不太被推荐,可能在需要强制注销用户时会被使用。

当前用户与服务器进行交互,当交互时间超过了默认时间之后,Session 就会失效。

设置方法:

session 设置最大不活动间隔为 30 乘以 60 ;该间隔的单位是秒 。

②、 设置当前应用 web.xml

 <session-config>
	 <session-timeout>600</session-timeout><!-- 单位分钟-->
 </session-config>

③ 、设置 tomcat web.xml

 <session-config>
	 <session-timeout>600</session-timeout><!-- 单位分钟-->
 </session-config>

同一 session 优先级 ① >② >③

四、 总结

Session 存在于服务器端。当浏览器被关闭时,浏览器不会向服务器发送任何请求以进行关闭操作。

Session 不会被销毁,自然也不会。不过可以做些努力,那就是在所有的客户端页面中使用 js 的。

使用 window.onclose 去监视浏览器的关闭动作,接着向服务器发送一个请求以关闭 Session 。不过这种做法在……

在实际开发中也不建议使用,最常规的做法就是对它置之不理,使其等到默认时间过后,自动进行销毁。

为什么当我们关闭浏览器后,就无法再访问之前的 session 呢?实际上,之前的 Session 一直存在于服务端。

当浏览器处于开启状态时,Cookie 存在于浏览器的进程中。而当我们关闭浏览器后,此时的 Cookie 就不再存在于浏览器进程中了。

就不存在了。其实Cookie以下有两种存储形式:

1 、 一种是存在于浏览器的进程中;

这种 Cookie 被称作会话 Cookie。当我们再次打开浏览器窗口时,之前 Cookie 里所存放的 Sessionid 已然

此时无法获取 JSESSIONID=Sessionid 的 session 了,因为它已不存在。服务器会返回一个新的 Sessionid,也就是新的那个。

此时开启了一个新的会话,即(session)。同时,服务器原先的 session 会在达到过期时间后自动被销毁。

2 、一种是存在于硬盘上(即持久化到硬盘)

这种会持久化到磁盘里,即便关闭了浏览器,可因为 cookie 已被写入磁盘,所以依然能够获取 sessionid,也就是能够获得

获取 session 状态,这种状态多用于自动登录。很多网站在登录后过一段时间再次访问仍然处于登录状态,这就是利用了持久化 cookie。

像百度网盘、csdn 这类情况(注:此句仅为推测,不能确定他们网站的具体实现方式)。

Google cookie默认本地存放目录

C:\Users 下有一个名为 xxxxxxx 的文件夹,在该文件夹的 AppData\Local 路径下,有一个 Google 文件夹,在 Google 文件夹的 Chrome 文件夹中,有一个 User Data 文件夹,在 User Data 文件夹的 Default 文件夹下,有一个 Cache 文件。

ps:

当浏览器进程中存在 cookie 时。有些浏览器不支持这样的规则,例如 IE 的 sessionid 在两个客户端之间是不共享的。

在同一个浏览器里同时开启多个标签,若发送同一个请求或者不同的请求,那么依然是同一个 session。

当不在同一个窗口中打开相同的浏览器时,若发送请求,那么仍会是同一个 session。

当使用不同的浏览器去发送请求时,即便发送的是相同的请求,那也是不同的 session。

重新打开窗口后,发起相同的请求,此时是不同的 session。

你可能想看:
« 上一篇
下一篇 »

相关推荐

java中什么是冒泡,冒泡算法

2026年09月06日

27阅读

java中冒号,java双冒号

2026年09月06日

26阅读

java中的->,java中的是什么意思

2026年09月06日

24阅读

java中的super用法,Java中super的说明

2026年09月06日

28阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

25阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

25阅读