问题:session什么时候被创建?
一个常见的错误是以为 session 在有客户端访问时就被创建,然而事实是直到某 server 端程序(如
Servlet )调用HttpServletRequest.getSession(true)这样的语句时才会被创建。
在浏览资料博客时,都能看到上面这句话,我一直疑惑我的代码中没有
HttpServletRequest.getSession(true),为啥还创建了session,以下为测试
新建了一个web项目 test
一 、 能获取session
1.单独运行jsp index.jsp (jsp网页默认包含page指令 <%@ page session=“true”%>)
在Tomcat服务器运行index.jsp,可以在tomcat的如下目录得到index.jsp编译后的Java文件 index_jsp.java,打开index.Java文件会看到 session = pageContext.getSession()
获取创建session
// index_jsp.java 中创建 session
session = pageContext.getSession();
// 类似以下两种写法
// 1 、创建一个新的session
session = request.getSession(true);
// 2 、有则获取现有的session,没有则创建一个新的session
session = request.getSession();
运行第一次,返回了 JSESSIONID ,说明以创建了 session
刷新网页 创建两个session 但路径不同
综上两点所述,session直到session = pageContext.getSession();才创建对象。
二、不能获取session
index.jsp添加 <%@ page session=“false”%> 后,需要关闭浏览器所有窗口或者关闭浏览器进程,负责上面测试的sessionid还在浏览器进程中保留得不到预期结果。
服务器没有返回JSESSIONID ,说明没有创建session
打开index_jsp.java文件
可以看到在里面没有发现 创建session的语句
三 、Session结束生命周期以及设置session过期时间:
1 、 Session.invalidate() 方法,不过这个方法在实际的开发中,并不推荐,可能在强制注销用户的时候会使用;
2、 当前用户和服务器的交互时间超过默认时间后,Session会失效
设置方法:
①、 session.setMaxInactiveInterval(30*60); //单位秒
②、 设置当前应用 web.xml
③ 、设置 tomcat web.xml
同一 session 优先级 ① > ② > ③
四、 总结
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…(ps:这句话不能保证,他们网站怎么实现不确定,感觉像这么回事))
Google cookie默认本地存放目录
C:\Users\xxxxxx\AppData\Local\Google\Chrome\User Data\Default\Cache
ps:
当cookie存在于浏览器进程中时(有些浏览器不支持以下规则,如IE的sessionid在两个客户端之间不共享)
1 、 在同一个浏览器中同时打开多个标签,发送同一个请求或不同的请求,仍是同一个session;
2 、 不在同一个窗口中打开相同的浏览器时,发送请求,仍是同一个session;
3 、 当使用不同的浏览器时,发送请求,即使发送相同的请求,是不同的session;
4 、 重新打开窗口,发起相同的请求时,是不同的session