webx - requst context之session

本文详细介绍了Session机制的工作原理,包括Session保存方式的选择及其优缺点,如保存在服务器内存、单一数据源、客户端Cookie等;同时深入探讨了Session框架配置、SessionID管理、生命周期管理等内容。

session概述

session的功能就是保存HTTP请求之间的状态数据。

1.session的保存

(1)保存在应用服务器的内存中。

对于集群来说,同一用户的两次请求可能被分配到两台不同的服务器上来处理:

 

  • session复制:
  1. 广播:这种方式下,任何一台服务器都保存着所有服务器所接受的session对象。当访问量增大时或机器增加时,网络负担成指数级上升。
  2. TCP-Ring:这种方式是把集群中所有的服务器看成一个环,A->B->C->D->A,把A的session复制到B,B的session复制到C,以此类推。这种方案的缺点:(1)配置复杂(2)每增加或减少一台机器,ring都需要重新调整。(3)前端Load Balancer要相当智能,才能将用户请求分发到正确的机器上

(2)保存在单一数据源中

  • 数据的性能成了问题。
  • 缺少应用服务厂商的支持。
  • 数据源成了系统的瓶颈。

(3)保存在客户端

保存在cookie中。

  • 每个domain最多只能有20条cookie,每个cookie长度不能超过4KB,否则会被裁掉。
  • 如果cookie被人拦截,拦截者并不需要知道cookie的意义,他只要原样转发cookie就可以达到目的。
  • 有些状态不可能保存在客户端。

(4)组合方案

将大部分的session数据保存在cookie中,将小部分关键和涉及安全的数据保存在服务器上,在服务器上,单一的数据源比复制session的方案更简单可靠。

 

 

Session框架

1.最简配置

<services:request-contexts xmlns="http://www.alibaba.com/schema/services/request-contexts">
<buffered />
<lazy-commit />
...
<session>
<stores>
<session-stores:simple-memory-store id="simple" />
</stores>
<store-mappings>
<match name="*" store="simple" />
</store-mappings>
</session>
</services:request-contexts>

 

2.Session ID

session框架支持把session id保存到cookie中,也支持把session id编码到URL中。

<session>
<id cookieEnabled="true" urlEncodeEnabled="false">
<cookie name="JSESSIONID" domain="" maxAge="0" path="/" httpOnly="true" secure="false" />
<url-encode name="JSESSIONID" />
<session-idgens:uuid-generator />
</id>
</session>

 

  • maxAge:session id cookie的最长存活时间,默认为0,表示临时cookie,随浏览器的关闭而消失。

 

3.Session的生命期

在session框架中,session model用来保存session生命期的状态,它被当作一个普通的对象保存在session中,但是通过HttpSession接口不能直接看到它。

<session maxInactiveInterval="0" keepInTouch="false" forceExpirationPeriod="14400"
modelKey="SESSION_MODEL">
...
</session>

 

  • maxInactiveInterval:指定session不活动而失效的期限,单位是秒。默认是0,也就是永不失效(除非cookie失效)。
  • keepInTouch:是否每次都touch session(即更新最近访问时间)。如果是false,那么只在session值有改变时touch。但如果session值长期不改变,由于最近访问时间一直无法更新,将会使session超过maxInactiveInterval所设定的秒数而失效。默认为false。
  • forceExpirationPeriod:指定session强制作废时间,单位是秒。

4.session store

 

类似于Servlet的配置,Session store的配置也包含两个部分内容:session store的定义和session store的映射。

<session>
<stores>
<session-stores:store id="store1" />
<session-stores:store id="store2" />
<session-stores:store id="store3" />
</stores>
<store-mappings>
<match name="*" store="store1" />
<match name="loginName" store="store2" />
<matchRegex pattern="key.*" store="store3" />
</store-mappings>
</session>


5.session Model

当需要保存session数据时,SessionModel对象将被转换成一个Json字符串,然后把这个Json字符串保存在某个session store中。需要读取时,先从store中读到上述格式的字符串数据,然后把它解码成真正的SessionModel对象。这个转换过程是通过SessinModelEncoder接口来实现的。

<session>
<session-model-encoders>
<model-encoders:default-session-model-encoder />
<model-encoders:model-encoder class="..." />
<model-encoders:model-encoder class="..." />
</session-model-encoders>
</session>

 

6.Session Interceptor

拦截接口

  • SessionLifecycleListener:监听session生命事件。
  • SessionAttributeInterceptor:拦截session读定事件。

拦截器实现:

  • <lifecycle-logger>:监听session生命事件,并记录日志。
  • <attribute-whitelist>:控制session中的attributes,只允许白名单中所定义的attribute名称和类型写入或读出于session store中。
<session>
<request-contexts:interceptors
xmlns="http://www.alibaba.com/schema/services/request-contexts/session/interceptors">
<lifecycle-logger />
<attribute-whitelist>
<attribute name="_csrf_token" />
<attribute name="_lang" />
<attribute name="loginUser" type="com.alibaba...MyUser" />
<attribute name="shoppingCart" type="com.alibaba....ShoppingCart" />
</attribute-whitelist>
<interceptor class="..." />
</request-contexts:interceptors>
</session>

 

Cookie store

webx主张把一切对cookie的读写,都转换成对session的读写。
1.多值cookie store

<services:request-contexts xmlns="http://www.alibaba.com/schema/services/request-contexts">
<buffered />
<lazy-commit />
...
<session>
<stores>
<session-stores:cookie-store id="temporaryClientStore">
<session-stores:cookie name="tmp" />
</session-stores:cookie-store>
</stores>
<store-mappings>
<match name="*" store="temporaryClientStore" />
</store-mappings>
</session>
</services:request-contexts>


cookie store依赖其它两个request contexts:<buffered>和<lazy-commit>。

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=AywiPrQKPEzfF9OZ; Path=/
Content-Type: text/html;charset=GBK
Content-Language: zh-CN
Content-Length: 48
Date: Mon, 06 Nov 2006 07:59:38 GMT
<html>
<body>
……


<buffered>将所有的输出到response.getWriter()或getOutputStream()的内容缓存在内存里,直到最后一刻才真正输出到浏览器,<lazy-commit>拦截response对象中引起提交的方法,将它闪延迟到最后才执行。

 

(1)Cookie的参数

<session-stores:cookie-store id="temporaryClientStore"
maxLength="3896" maxCount="5" checksum="false">
<session-stores:cookie name="tmp" domain="" path="/" maxAge="0" httpOnly="true"
secure="false" survivesInInvalidating="false" />
</session-stores:cookie-store>
  • maxCount:指定cookie的最大个数。

(2)Session Encoders

 

<session-stores:cookie-store>
...
<session-stores:encoders>
<session-encoders:encoder class="..." />
<session-encoders:encoder class="..." />
<session-encoders:encoder class="..." />
</session-stores:encoders>
</session-stores:cookie-store>


基本配置,用hessian算法(默认)来序列化,不加密

<session-stores:cookie-store>
<session-stores:encoders>
<session-encoders:serialization-encoder />
</session-stores:encoders>
</session-stores:cookie-store>


使用aes算法加密

<session-stores:cookie-store>
<session-stores:encoders>
<session-encoders:serialization-encoder>
<session-serializers:hessian-serializer />
<session-encrypters:aes-encrypter key="0123456789abcdef" />
</session-encoders:serialization-encoder>
</session-stores:encoders>
</session-stores:cookie-store>


使用java原生的序列算法

<session-stores:cookie-store>
<session-stores:encoders>
<session-encoders:serialization-encoder>
<session-serializers:java-serializer />
</session-encoders:serialization-encoder>
</session-stores:encoders>
</session-stores:cookie-store>


2.单值cookie store

前面所描述的cookei store,是在一组cookie中保存一组attributes名称和对象,它所创建的cookie值,只有session框架自己才能解读。

<session>
<stores>
...
<stores:single-valued-cookie-store id="loginNameCookie">
<stores:cookie name="login" />
</stores:single-valued-cookie-store>
</stores>
<store-mappings>
...
<match name="loginName" store="loginNameCookie" />
</store-mappings>
</session>

(1)Session Value Encoders

和前面所说的Session Encoder不同,Session Value Encoder只转的是session attribute的值,而Session Encoder需要转换一组session attributes的key-values。

<session-stores:single-valued-cookie-store>
...
<session-stores:encoders>
<session-value-encoders:encoder class="..." />
<session-value-encoders:encoder class="..." />
<session-value-encoders:encoder class="..." />
</session-stores:encoders>
</session-stores:single-valued-cookie-store>


其它Session Store

1.simple Memory Store

这种store不支持多台机器的session同步,而且也不关心内存是否被用尽。只能用于测试环境。


最后欢迎大家访问我的个人网站:1024s

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值