webx3中的session框架

 

关于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>

 

你可能感兴趣的:(session)