Session的创建和消亡
1.Session的创建:
Session并不是一访问网页就会立即被创建, 而是在调用request.getSession()方法时才会被创建。
什么时候会调用request.getSession()方法分为两种情况:
①如果servlet中没有调用request.getSession()方法,那么服务器永远都不会创建session
②如果用户第一次访问servlet页面, 会调用request.getSession()方法创建一个session,
当用户第二次访问该servlet时, 会先去服务器中寻找对应的session,如果有就不创建,没有才会创建。
注意:jsp默认调用getSession()方法。
默认的情况下,用户第一次访问jsp页面就会创建session,因为jsp中指令session默认配置为true,
即<%@ pagesession="true"%>,在index.jsp的java代码中,自动获取了session。
jsp的本质是servlet,只有在servlet中调用request.getSession(),服务器才会产生session。如果调用 request.getSession(false);将不会产生session。
2.session的消亡:
默认情况下超过30分钟会消亡。这里的30分钟,不是指session的生命周期,而是客户端不与服务器进行交互后到session自动销毁的时间间隔。如果客户端一直与服务器进行交互,或者客户端会定时向后台发送请求以确保session不过期(新浪微博就是这样的机制),那么只有在浏览器关闭之后等待超时才会销毁session。
浏览器关闭后session会不会消亡?
Session是一种服务器端的对象,保存在服务器中。每个Session 有一个唯一的Sessionid。 Session的超时也是由服务器来控制。我们一般都会把Session和Cookie放在一起来说,Cookie分为内存中Cookie(也可以说是进程中Cookie)和硬盘中Cookie。大部分的Session机制都使用进程中Cookie来保存Sessionid的,关闭浏览器后这个进程也就自动消失了,进程中的Cookie自然就消失了,那么Sessionid也跟着消失了,原有的session仍然存活在服务器中。当我们重新打开浏览器窗口时,就无法根据Sessionid找到原来的Session了,此时服务器从HttpServletRequest对象中没有检查到sessionid,服务器会再发送一个新的存有Sessionid的Cookie到客户端的浏览器中,此时对应的是一个新的会话,而服务器上原先的session等到了它的默认时间之后,便会自动销毁。
其实服务器是不会知道浏览器关闭了没有(当然,你可以在关闭的时候去通知服务器,但一般都不会这样做),所以关闭浏览器时服务器是不会删除Session的,也正是这个原因服务器才会设置一个Session失效时间的,不然服务器早晚会被撑爆的。等距离上一次使用该Session的时间达到设置的失效时间时,服务器就会认为客户端已停止活动,便会将相应的Session删除。
如何在浏览器关闭后找到原来的session?
//1.创建一个cookie,保存原session的id
Cookie cookie = new Cookie("JSESSIONID", session.getId());//此处的session是原来的session
//2.设置cookie的生命时长为24小时,此时浏览器就会把cookie保存到硬盘上,这个cookie就变成了硬盘中Cookie,
浏览器关闭后硬盘中Cookie并不会消失,重新打开浏览器后,这个cookie仍然有效直到超过设定的生命时长。
cookie.setMaxAge(60*60*24);
//3.设置cookie的使用路径,下面这种设置表明在整个web范围内都可以使用这个cookie
cookie.setPath(request.getContextPath()+"/");
//4.将cookie添加到响应头中
response.addCookie(cookie);
上述设置完成之后,重新打开浏览器,保存原来sessionid的cookie仍然存活,此时就可以通过原来的sessionid找到原来的session。