Web容器的会话机制

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

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

另外,客户端是如何把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机制在软件设计时都会有很大的帮助。cookie

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

鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有须要的朋友能够到 item.jd.com/12185360.ht… 进行预约。感谢各位朋友。数据结构

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

这里写图片描述
这里写图片描述
相关文章
相关标签/搜索