基本全部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传递到服务端的呢?通常会有三种方式,服务器
Web容器的会话机制补充了http协议的无状态性,使web在应用功能方面更增强大,知足了更多更复杂的需求。无论是web应用层开发人员仍是中间件开发人员深刻理解session机制在软件设计时都会有很大的帮助。cookie
========广告时间========session
鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有须要的朋友能够到 item.jd.com/12185360.ht… 进行预约。感谢各位朋友。数据结构
=========================
欢迎关注:
jsp