绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
Web容器的会话机制
2017-06-29 10:16:10

基本所有web应用开发的朋友都很熟悉session会话这个概念,在某个特定时间内,我们说可以在一个会话中存储某些状态,需要的时候又可以把状态取出来,这整个过程的时间空间可以抽象成“会话”这个概念。

尽管你对session的使用已经很熟悉了,但你未必真正理解session是什么。因为你可能只是使用了request.getsession().setAttribute("users", username)把某个值设置到会话中的users变量里面,只是使用了String username = (String)request.getsession().getAttribute("users")获取会话中users变量的值,对于里面具体做了哪些操作、实现机制是如何的可能比较模糊。而这里将对符合Java规范的web容器的会话机制做一个简单大概的描述。

关于web容器的会话运行机制可以根据上图帮助理解,某个客户端向WebContainer发起请求,http请求报文的cookie头部携带了会话标识jsessionid(假设使用tomcat,会话标识取为jsessionid,其他服务器可能参数名称不叫jsessionid),在我们的WebContainer中,假如已经写好了一个servlet专门用于处理此请求 ,如果要设置某个值到会话中则使用request.getsession().setAttribute(“key”,val),执行此语句具体做了哪些操作呢?

首先getsession方法其实就是根据jsessionid从web容器的会话集中查找属于此客户端的会话对象,数据结构如上图的下半部分所示,例如客户端传的值为jsessionid1,则找到对应的会话session1。
其次是调用获取到的会话session的setAttribute方法,它其实是往会话中保存数据,session1包含了一个kv结构用于存放数据,所以其实就是把键值放到kv结构中。
后如果要获取会话的值则使用request.getsession().getAttribute(“key”),如果已经搞懂了会话的设置则很好理解,先根据jsessionid获取session对象,再根据key获取session对象里面的kv集对应的值。

另外,客户端是如何把jsessionid传递到服务端的呢?一般会有三种方式,

  1. cookie方式,即通过浏览器读取小文本cookie,读取jsessionid值后附加到http协议的cookie头部,http协议报文传输到服务端后解析cookie头部便可以获取,但如果你把浏览器的cookie给禁止了则这种方式会失效。
  2. 重写url方式,即把jsessionid附加到请求的url中,例如www.tomcat.com/index.jsp?j…
  3. 表单隐藏方式,这种方式其实类似重写url方式,我们把jsessionid及其值存放在html表单中,提交时就会一起被提交,服务端只要根据post或get方法分别解析便可获取到。

Web容器的会话机制补充了http协议的无状态性,使web在应用功能方面更加强大,满足了更多更复杂的需求。不管是web应用层开发人员还是中间件开发人员深入理解session机制在软件设计时都会有很大的帮助。

========广告时间========

鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 item.jd.com/12185360.ht… 进行预定。感谢各位朋友。

=========================
欢迎关注:

这里写图片描述
这里写图片描述

分享好友

分享这个小栈给你的朋友们,一起进步吧。

远洋号
创建时间:2020-05-19 15:46:16
《图解数据结构与算法》《Tomcat内核设计剖析》书籍作者,公众号:《远洋号》,笔名:seaboat,擅长工程算法、人工智能算法、自然语言处理、架构、分布式、高并发、大数据、搜索引擎等方面的技术,大多数编程语言都会使用但更擅长Java、Python、C++。平时喜欢看书、写作、运动,擅长的项目有篮球、跑步、游泳、健身、羽毛球。崇尚开源,崇尚技术自由,更崇尚思想自由。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • seaboat
    栈主

小栈成员

查看更多
  • 小雨滴
  • Tester9456
  • 栈栈
  • dkl187788
戳我,来吐槽~