session概述
session的功能就是保存HTTP请求之间的状态数据。
1.session的保存
(1)保存在应用服务器的内存中。
对于集群来说,同一用户的两次请求可能被分配到两台不同的服务器上来处理:
- session复制:
- 广播:这种方式下,任何一台服务器都保存着所有服务器所接受的session对象。当访问量增大时或机器增加时,网络负担成指数级上升。
- 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