关于webx3的session
webx3中实现了一个session框架,可以通过webx.xml中的设置将session保存在不同的地方,常用的有服务器内存和cookie;还可以将session的不同部分分别保存到不同的地方。
session框架
session ID是唯一标示,一般将其保存在cookie中,这样相同cookie值的请求都看作是同一个session的请求。
session的生命周期:第一个请求时创建;在访问期间可以不断地更新;超过配置的最大不活动时间就会结束,还可以通过调用session.invalidate()方法,直接清除session的所有内容;
Session Store是session框架中最核心的部分,定义了session保存的位置,可以设置多个store,这样就可以将session不同的部分保存在不同的地方。
在session框架中,有一个重要的特殊对象,用来保存session生命期的状态。这个对象叫作session model。
Session Model是用来记录当前session的生命期数据的,例如:session的创建时间、最近更新时间等。
SessionModelEncoder
默认情况下,SessionModel对象将被转换成一个JSON字符串,然后这个字符串将被保存在某个session store中;读取时需要解码成SessionModel对象。
默认实现为:
<session-model-encoders>
<model-encoders:default-session-model-encoder />
</session-model-encoders>
Session Interceptor拦截器的作用是拦截特定的事件,甚至干预该事件的执行结果。
Cookie Store
Cookie Store的作用,是将session对象保存在客户端cookie中。Cookie Store减轻了服务器维护session数据的压力,从而提高了应用的扩展性和可用性。
但是读写cookie比较麻烦,还要在代码中设置很多参数:domain、path、httpOnly...等,所以通过操作HttpSession,session框架就帮我们读写cookie了(那些参数在配置文件里配置就ok)。webx主张把一切对cookie的读写,都转换成对session的读写。
Session Encoders
Session里保存的是Java对象,而cookie中只能保存字符串。如何把Java对象转换成合法的cookie字符串(或者将字符串恢复成对象)呢?这就是Session Encoder所要完成的任务。详细见下面。
Cookie Store需要依赖其它两个Request Contexts: <buffered>(将所有的输出到response.getWriter()或getOutputStream()的内容缓存在内存里,直到最后一刻才真正
输出到浏览器) 和 <lazy-commit>(拦截了response对象中引起提交的方法,将它们延迟到最后才执行。)
Cookie Store分为多值和单值;
- 多值Cookie Store是在一组cookie(如tmp0, tmp1, ...)中保存一组attributes的名称和对象。它所创建的cookie值,只有session框架自己才能解读,如<key,value>的形式。
- 单值cookie store就是在一个cookie中仅保存一个值或对象,如<object>。
Session Encoders和Session Value Encoder
这两个cookie store的结构是不一样的。因此解码的方法也不一样。单值的cookieStore使用Session Value Encoder解码;多值的cookieStore使用Session Encoder。
Session Encoders
Session Encoder需要转换一组session attributes的key-values。Session框架提供了一种encoder的实现,编码的基本过程为:序列化、加密(可选)、压缩、Base64编码、URL encoding编码。
保存session数据时,session框架将使用第一个encoder来将对象转换成cookie可接受的字符串;
读取session数据时,session框架将依次尝试所有的encoders,直到解码成功为止。
默认实现为:
<session-stores:encoders>
<session-encoders:serialization-encoder />
</session-stores:encoders>
Session Value Encoder
session Value Encoder只转换sessionattribute的值。
和SessionModelEncoder以及SessionEncoder类似,session框架也支持多个session valueencoders同时存在。
- 保存session数据时,session框架将使用第一个encoder来将对象转换成cookie可接受的字符串;
- 读取session数据时,session框架将依次尝试所有的encoders,直到解码成功为止。
这种编码、解码方案可让使用不同session value encoders的系统之间共享cookie数据,也有利于平滑迁移系统。
目前有两种基本的session value encoders实现。<simple-value-encoder>和<mappedvalues-encoder>
Simple Memory Store
SimpleMemoryStore是最简单的session store。它将所有的session对象都保存在内存里面。这种store不支持多台机器的session同步,而且也不关心内存是否被用尽。因此这种简单的store一般只应使用于测试环境。
<stores>
<session-stores:simple-memory-store id="simple" />
</stores>