session分析

2019-01-21 02:39:47来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

一:为什么需要session

   因为http,https是无状态的,也就是当我们连续两次访问同一个web网站,网站是无法分辨这两次访问是来自同一个人。对于它来说,这两次访问是没有关系的。

就像是,我们进入了澡堂洗澡,中途要从入口出来接电话,可是当我们再次进去的时候,人家就不认识你了,还管着问你要贵宾卡呢!那么怎么让这个门口迎宾能认出你是VIP呢?

答案当然是VIP的卡嘛!就类似于令牌。每次进澡堂子就分配一个。这样不管你中途出来接多少次电话,只要这VIP卡不过期,人家都会对你客客气气,让你有一种宾至如归的感觉!

所以我们知道session的第一个作用是令牌,让网站记住我们的访问。

           如果你觉得session的作用只有这样,那你就太天真了!我们还是从去澡堂子聊起。去过澡堂子的人都知道,我们是穿着衣服去澡堂子的,还会有手机,没准身份证什么的。这些东西都得有地方存放!

那这时候我们的贵宾卡就起到作用了,一般澡堂子都会有一个跟卡对应的柜子,可以用卡刷开。这个柜子可以放我们所有的个人物品。那么聪明的你,是不是想到了session之于网站的相似功能呢?没错,

session在我们登录之后,就可以手动存放你所有想放入的一切。包括用户的基本信息,权限等。(但是切忌不要存太多东西,毕竟澡堂子的柜子都不会太大,也不会太多!太大,太多会把澡堂子撑爆的!)。

那么这个存放东西的柜子在web网站的哪里呢?答案是web网站的内存中。这个存取需要你手动进行。所以,你就知道了session的第二个作用是,存东西

二:session的作用原理

  当我们的请求到达自服务器的时候,服务器并不一定为我们分配session。只有当我们显式调用getSession()或者getSession(true)才会真的产生。因为服务器保存session是需要开销的,只有当你真的

显示去调用这个方法,服务器才知道你有这个需求。但是很多情况下我们似乎并没有显式去调用这个方法,却能看到cookie这个请求头中有jsessionid,这是为什么呢?你们有没有发现,我们的jsp头部会默认有

一个session=true的属性?有这个属性后,服务器将jsp转为servlet后,里面就会有显式的调用这个方法,所以也同样会产生session。

       上面说了产生session的时机,那么当显式调用后,服务器就会生成一个按照'随机数+时间+jvmid'的规则生成的sessionId,tomcat服务器中叫jsessionId。并在服务器内存中开辟一个内存区域,与这个sessionId对应。

sessionId是这个内存区域唯一的存取凭证。

       那么session到底是一个什么样的数据结构呢?相信聪明的你,通过根据sessionId去获取session就会猜想session的结构是一个MAP.事实确实如此,session的数据结构是ConcurrentHashMap<String,ConcurrentHashMap<String,Object>>

ConcurrentHashMap保存它的并发安全性。而里面一层的Map则是某个用户的多个session级属性。

        那么session是如何使用呢?当我们服务器生成一个session和sessionId后,就会通过一个set-Cookie的Header,通知浏览器你要在用户本地创建一个cookie.用来保存这个sessionId.这个Header中还包括path和httpOnly,过期时间(默认是-1,表示

一个会话期)。浏览器保存这个sessionId的Cookie后,后面的每次请求,浏览器都会自动去将这个cookie设置到请求头中,那么服务器接收到请求后,就会说“哦,老熟人又来了”。这个ssesionId能获取到对应的session。也就能知道前面操作留下的数据。

         那么服务器的这个session什么时候会消失呢?很多人可能会猜想一个貌似完美的方案,当浏览器关闭后,session就会消失?但是事实是不可能的!因为我们知道,不可能关闭浏览器后,就去触发一个请求去通知浏览器,调用session的过期或者

删除方法。这样就将浏览器和服务器强烈耦合在一起!另外一个合理的做法是,当浏览器关闭后,意味着一个会话期满后,浏览器之前创建的Cookie就会失效。这时候再打开浏览器,它是不会再在请求中附上之前那个sessionId的,所以尽管这个时候这个session可能还

存在,但是没有没有sessionId这个凭证来操作它了!那么session都会有一个过期时间。这个都是可配的,一般在web.xml中。那么如果一个session的最后操作时间距离某个时间点,中间的时间间隔恰好是>=那个过期时间,那么当检查进行时,就会销毁这个session。

三,session机制存在的问题

       第一个,大家在上面可能会发现,sessionId这个凭证,是保存在用户本地的。那么如果一旦被别人找到并复制了这个凭证,就意味着他也能获取服务器的认证,能获取到服务器上你存放的东西了!着就像是好莱坞大片里经常

出现的特工冒用别人身份的桥段。

 


原文链接:https://www.cnblogs.com/diexian/p/10284635.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Java的值传递和引用传递

下一篇:Integer a= 127 与 Integer b = 128相关