有关什么情况下session会失效

以前发了一个帖子,觉得好奇很多人竟然认为关闭浏览器
session就失效了  或者认为session失效和关闭浏览器有关系
很多评论  让我很诧异啊

这边统一回复一下吧 
可以肯定的说session失效和浏览器是没有任何关系的

session本身有一个存活时间,在tomcat中默认的是30分钟,
和浏览器是没有关系的
因为即使你浏览器一直开着,如果在30分钟内没有发出任何请求,
那你原来存在服务器上的session域内的东西就全没有了,
你再次访问的时候,服务器会新建一个session的。
通过session的ID来判断是不是新的session

session时间的改变是通过session.getMaxInactiveInterval()改变的

session 失效除了上述的超时
还有就是调用invalidate()
或者服务器重启或者中断

所以如果当你设置session的MaxInactiveInterval为-1时
并且关闭了浏览器  那么你的session会一直存在

除非重启jsp服务器


我怎么觉得很多网站,关闭浏览器重新打开后,就要重新输入用户密码了

当你第一次访问一个网站的时候,网站服务器会在响应头内加上Set-Cookie:PHPSESSID=nj1tvkclp3jh83olcn3191sjq3(php服务器),或Set-Cookie JSESSIONID=nj1tvkclp3jh83olcn3191sjq3(java服务器)信息,此信息是服务器随机生成的,放在服务器内存里,为了标识唯一的客户端用户,内容不会重复,这就是sessionid.
   当浏览器得到这个sessionid会将它放在自己的进程内存里,这里不同的浏览器会有所不同,IE进程间不能共享这个sessionid,也就是新开一个IE将不能共享这个sessionid;而Firefox进程间可以共享.然后你继续发请求给这个网站的时候,浏览器就会把这个sessionid放在请求头里发送给该服务器了,这样服务器得到sessionid后再和自己内存里存放的sessionid对比锁定客户端,从而区分不同客户端,完成会话.
   可以看出如果用这种方式,当用户在会话的过程中关闭浏览器结束进程,则这个sessionid将消失,如果用户又打开浏览器想继续这次会话的时候,就会因为发送的请求中没有这个sessionid而使服务器无法辨别该把那个session信息给他,注意(这个时候服务器端的sessionid和sessionid所指向的session都还存在,只是没有正确的sessionid和它匹配而占用服务器内存,只有session过期或服务器重启才释放内存).
   上面这种方式叫会话cookie,把cookie放在浏览器内存里,只能在这个浏览器的内存范围里完成会话,是一种不长久的方式,为了能长久会话,就出现了持久化cookie,把cookie固化在用户的计算机上,现在的cookie不单单能存放sessionid,还能放用户信息,样式表信息等.
   如果用户禁止了所有cookie的使用,那么会话cookie和持久化cookie都不能用了,有个方案也可以解决问题,就是URL重写,这里要说下的就是URL重写只能实现会话cookie的效果,持久会话实现不了. 

原来是这样,怪不得有些网站关闭浏览器就要重新登录了

http://bbs.csdn.net/topics/390796397 这个帖子也讨论了关于session的问题 ,我不太明白 

怎么让用户一直操作的情况下,定时的让session失效,达到重新验证用户的效果。依靠数据库吗?

楼主说了服务器端,二楼说了客户端,都不错。

对于服务器端,session可以几种实现,可以放在内存里,可以存在文件里,甚至可以存在数据库里(这样session就可以永久保持不担心丢失)。对于客户端,session一般通过cookie保持,这样就能实现自动登录。

我这里关于服务器重启会不会导致session失效有一些不一样的看法,在停止服务器是,session会序列化,发生钝化现象,进而存储在硬盘上,而当服务器重启时,又会把session加载进内存中,从而活化。因此在服务器停止,重启时,若你的浏览器未关,你仍然在登录状态

猜你喜欢

转载自blog.csdn.net/czh500/article/details/80211410