简单理解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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章