在Servlet中,Session和Cookie是分开的。Session1般保存在内存中,固然也能够保存在数据库等其他地方。如果保存在内存中,对服务集群来讲就需要解决Session同享的问题。如果保存在数据库,就存在单点故障、性能差等问题。
webx提供了会话框架,将session这样复杂的问题统1进行解决。在webx框架中,主张将cookie合并到session中,再通过规则,路由到cookie或session中。cookie保存在客户端,session保存在服务端,它们的区分这里就不赘述了。
webx中有1个SessionStore的概念。它相当于Session的保存容器。容器可以配置不同的编码、加密方式等。与servlet配置类似,session
的配置有stores
和store-mappings
。下面是1个简单的例子(仅用于调试):
SessionID
。在Servlet中,默许是通过名为JSESSIONID的Cookie保存SessionID。在webx中可以换用不同的Cookie名称,而且SessionID
的生成方法也能够改变。下面是改变SessionID
字段的例子。
Cookie属性有下面几个,都可以通过属性进行设置。name
,domain
,maxAge
,path
,httpOnly
,secure
。
与其他框架不同的是,如果Http要求中的SessionID
不认识,之前没有出现过,那末会将HTTP要求中的SessionID
作为该客户真个SessionID
,而不是创建1个新的。这样设计的好处是,有可能SessionID
与其他利用同享,其他利用生成的SessionID
是不能覆盖的。
会话RequestContext的属性有以下几个。
属性 | 作用 |
---|---|
maxInactiveInterval |
Session的失效时间 |
keepInTouch |
默许为false 。如果为true ,表示和servlet中的session模式1样,每次读取session的时候更新session,如果为false ,只有在session内容产生改变时才更新session时间。 |
forceExpirationPeriod |
疏忽失效时间,即便这个session1直被访问,超过这个事件,session还是会失效 |
modelKey |
用于保存session状态的对象名称,1般不需要修改。默许为SESSION_MODEL 。 |
SessionStore
。下面是SessionStore
的1个例子。
match
标签采取了正则匹配,如果有多个规则符合正则表达式,那末有下面的优先级:
regex
优先*
默许规则只能有1个。
SessionModel
。它是1个寄存在Session中的字段,用于记录Session中各个字段的生命周期数据,比如创建时间,最后更新时间等。它可以看成1个普通的session字段,因此可以配置匹配规则,放到指定的session容器中。
SessionModel
可以转换成字符串,默许是转换成json,并作为普通的字段保存到session中。
Session拦截器。框架提供了两个自带的拦截器:lifecycle-logger
和attribute-whitelist
,它们的用法在下面这个例子中已非常清楚了。固然也能够定义自己的拦截器,有两种拦截器可以选择:
SessionLifecycleListener
:监听Session的生成、烧毁、访问事件。SessionAttributeInterceptor
:监听Session的读写事件。
框架会根据基类自动配置不同的拦截器。
CookieStore
。有些安全性要求不高的session字段没必要保存在服务端,而是保存在阅读器端。这样对服务器的压力也会小1些。
Cookie中只能寄存字符串,而session中可以寄存java对象,因此对接cookie和session需要将Java对象转换成字符串。这类转换交给encoder
进行。配置方法以下:
可以指定多个encoder
,写入session时,使用第1个encoder
进行编码,读取session时,顺次使用不同的解码器进行解码,直到正确解码为止。
框架自带了几个编码器,默许使用hessian进行编码。
编码后加密。