如何理解SessionId? 如何理解SessionId?

如何理解SessionId?

原创 2017年06月14日 18:48:06

有登录过网站经验的人儿都会遇过这样的一种情景:在登录过一个网站,只要保持浏览器处于打开状态,即使把有关该网站的页面都关掉,再访问该网站依旧会处于登录状态。反之,把浏览器关掉,下次再访问该网站就处于离线状态。举个例子,我访问了酷狗和CSDN的网站,一边听歌一边写写东西,出于某种原因我把CSDN的网页关了,此时我再访问CSDN时可以发现依旧处于登录状态。但如果我关掉的是浏览器,则需要登录后才能继续写东西,当然,这里不考虑某些网站开发出了自动登录等功能。

网页是基于Http协议进行解析的,而Http是无状态协议。所谓的无状态便是下一次访问并不知道上一次访问的情况,每访问完一次后便断开连接。那么,服务器是怎么识别访问的用户身份的呢?这里便运用到了Session和Cookie。了解过Session和Cookie的人都会知道,Session是保存在服务器端的,而Cookie是保存在客户端的。那么,在服务器Session是怎么识别用户?

对此,我新建了一个工程,设置了拦截器识别用户是否已经处于登录状态,登录了便可访问测试页面,未登录便跳到登录页面。



在每次程序初始化的时候,通过客户端查看Cookie的值可以看到存在一个SessionId。即程序初始化时,服务器通过Response把SessionId返回给客户端,而客户端则把它用Cookie存放起来。接下来每次访问该网站的时候都会带着这个SessionId访问,后台根据SessionId便可以知道用户的状态,而一旦浏览器被关闭,改Cookie也会被默认清除掉。问题似乎到这里便解决了,但重启了服务器几次之后,发现每次初始化时Response返回SessionId是一样的,也就并不存在唯一性,不存在唯一性也就说明它不能作为识别作用。


于是继续往下看,发现在tomcat中,Session是以HashMap的格式存放在org.apache.cataline.session.ManagerBase这个类中的,即以key-value的格式存放,key为sessionId,value则为org.apache.cataline.session这个接口。到这里,我们可以发现,程序初始化返回给客户端的SessionId其实是一个键,通过这个键,可以找到org.apache.cataline.session这个接口,而这个接口由org.apache.cataline.session.StandardSession类实现,同时这个类也实现了HttpSession,而HttpSession在tomcat中的数据,便是用session.setAttribute(key,value)设置的数据。

到这里,基本上也就能解释模拟情景出现的情况。浏览器关闭后,清除掉的是SessionId而不是Session,此时,Session还是依旧存在服务器中。在新的访问过程中带给后台不再是之前的SessionId,找不到之前对应的值也就不能够识别用户的身份。而浏览器不关闭,保存SessionId值的cookie没有被删除,排除人工修改的可能,新的访问带给后台的还是原来的SessionId,服务器通过SessionId找到Session的值,因此也就保持原来的状态。

猜你喜欢

转载自blog.csdn.net/qq_35891226/article/details/79979215
今日推荐