简单理解SESSION

网上对SESSION的介绍很多,但其描述往往偏重于某个角度,以至于像我这样的菜鸟对SESSION的理解如盲人摸象一般,始终朦朦胧胧。“SESSION”到低是个什么?经过学习,本人对SESSION终于有了一个简单却又清晰的认识。

 

浏览器进程(注1)和服务器进程(注2)进行通迅时,服务器进程为了区别不同的浏览器进程,会通过浏览器进程的cookie功能(注3),给每个浏览器进程“起个名字”。具体就是当浏览器进程第一次访问服务器进程,服务器进程会在浏览器进程cookie中创建一个"sessionID",同时在服务器上开辟一个该sessionID对应的存贮区域(注4)。之后每次该浏览器进程向服务器进程发送请求,服务器进程就能根据sessionID弄清楚访客身份。最常见用法比如用户登录,服务器进程接到浏览器进程访问请求后发现sessionID对应存贮区域中没有登录信息(注5),于是可以返回一个登录界面要求客户端输入帐号和密码。当浏览器进程向服务器进程提交了用户输入的帐号和密码,服务器进程验证后可以将验证结果保存在sessionID对应存贮区域中,并为之后该浏览器进程对服务器资源的访问开启绿灯。

 

综上所述,"SESSION"包含了以下三个部分:

1.支持cookie功能的浏览器进程

2.响应浏览器进程的服务器进程

3.服务器进程为cookie中SESSIONID开辟的对应存贮区域(数据结构)

   在java web中,可通过HttpServletRequest.getSession获取到这个数据存贮区域;

 

注1:多年前在防页面假死技术刚流行时,曾出现几款多线程浏览器。你浏览器上打开多个窗口,但任务管理器里只能看到一个浏览器进程。这种技术有防页面假死功能,而且消耗的系统资源相对较少。不过多线程浏览器导致多个窗口共用一个SESSION,造成了应用的麻烦,再加上多线程浏览器在防假死上不如多进程浏览器彻底,所以多线程浏览器未能流行开来。

 

注2:服务器进程比如tomcat,它会加载我们web项目中的程序代码,并在浏览器进程发送来请求后运行这些代码。浏览器进程我们很难内窥其原理,但开源的tomcat网上有很多文章介绍其原理。

 

注3:理论上也可以通过URL重定向或隐藏表单什么的来代替cookie,不过现实在中谁没事去禁止浏览器的cookie功能呢?

 

注4:为什么不直接把数据全放浏览器进程cookie里而要在服务器端开辟个对应存贮区域?当然是为了安全。

 

注5:也可能第一次访问SESSION尚未建立。HttpServletRequest.getSession可以使用参数“true”表示如果SESSION不存在则新建立一个SESSION。

 

SESSION什么时候消亡?

在谈论session机制的时候,常常听到这样一种误解“只要关闭浏览器,session就消失了”。其实可以想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对session来说也是一样的,除非程序通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session。

恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为seesion设置了一个失效时间,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值