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。