session分析
2019-01-21 02:39:47来源:博客园 阅读 ()
一:为什么需要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开发手册中不允许魔法值出现在代码中? 2020-06-09
- 计算机基础到底是哪些基础?为什么很重要! 2020-06-08
- 为什么阿里巴巴Java开发手册中强制要求接口返回值不允许使用 2020-06-06
- 数据结构:用实例分析ArrayList与LinkedList的读写性能 2020-06-04
- 数据分析 | 数据可视化图表,BI工具构建逻辑 2020-06-02
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash