简单谈谈session机制的原理

做过web开发相信都对session这玩意挺熟悉的,今天无意间看到了篇讲session文章,自己也总结一下以此迎新年吧。

通常session机制可以借助cookie来实现,如果cookie被客户端禁止了,也能通过其他方式来实现,但是万变不离其宗,只要明白了原理就好办了。


一、这里先简单说下借助cookie来实现session机制的原理(以apache-tomcat-7.0.32为例):
1、Client初次向Server发送请求,Server发现Client没有携带名JSESSIONID的cookie。于是Server创建一个session对象同时生成一个唯一的JSESSIONID,Server会为两者建立一个映射关系。Server在响应Client的时候会向客户端写一个名为JESSIONID的cookie,这个cookie在浏览器关闭时失效。
2、Client再次向Server发送请求时,会携带这个名为JSESSIONID的cookie,tomcat取得JESSIONID的值,就可以通过映射关系去找session对象了。

//TODO 上图


二、说完了session的大致工作流程之后,就可以再说说所谓“session没了”的两种情况了:
1、浏览器关闭。JSESSIONID这个cookie失效了(通过控制cookie的有效期实现),Client再次向Server发送请求时,因为没有携带JSESSIONID这个cookie,Server会新建一个session了,并向Client写一个新的JSESSIONID了,这就跟Client初次向Server发送请求一样。
2、Server设置了session超时。会话超时时限到了,session被Server清理掉了,Client再次向服务器发送请求时,虽然携带了JSESSIONID这个cookie,但是Server通过映射关系找不到session了。于是Server会生成一个新的session对象和唯一的JSESSIONID值,并向Client写这个新的JSESSIONID。

三、梳理了“session没了”的两种情况之后,就产生了疑问:

尤其是第一种情况,当Client的JESSIONID这个cookie失效时,Server就会像Client初次访问一样,创建session对象并向客户端写JSESSIONID,那么原来的sesson对象是什么时候从服务器内存中清除的呢(肯定会清除,因为不清除最终会耗尽服务器内存)?


四、于是写了个简单的HttpSessionListener来打印session的创建和销毁,在apache-tomcat-7.0.32下试验,从结果表现中得出了如下一些结论:
1、不管是Client关闭浏览器的情况还是服务端session超时,tomcat都是要等到服务端session的超时之后(第2点解释为啥是之后)才清理session对象。
例:服务端超时设为1小时、客户端关闭浏览器,1个小时到了才会清除对应的session对象。
2、tomcat对超时的session的session对象的清除并不是即时(超时时间到就清除)的,而是使用一个1分钟定时任务,定时清除当前超时的session的session对象,也就是说,对过期的session的session对象的清除有小于1分钟的延时。
例:不断重复的打开浏览器访问tomcat,然后立即关闭。但是session对象的清理一直只在每分钟的一个固定点上。
3、服务端session超时之后,但还没到定时清理session对象的点(有小于1分钟的延时),这时客户端却再次发来请求(携带了即将被清理的session对象对应的JSESSIONID),则会立即清除原来的session,并创建新session且向客户端写新的JSESSIONID。

例:服务端超时设定为2分钟,已测出每分钟29秒的时候清除session对象。0秒的时候访问tomcat然后一直静默(等待服务器超时),2分钟后的0秒session对象并没有被清除(要等到29秒这个点),如果一直静默,则到29秒时session对象被清除。但是在大约15秒的时候发送一次请求,则session对象立即被清除并生成新的session对象。(这里推测可能是先找到了session对象,然后发现已超时,所以立即清除,并生成新的session对象)


2014年是挺充实的一年,虽然也发现了自己很多短板,但总体上说进步不小(希望不是自己自我感觉良好,哈哈)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值