客户会话状态(Client Session State)
运行机制
- 有时,客户端需要客户会话状态,比如,如果让服务器无状态,则所有状态信息都需要客户端保存;
- 使用HTML,一般有三种方法:
- URL参数化。令URL带上少数个会话状态作为参数。
- 表单的隐藏域。隐藏域是一些不会在Web页面上显示的表单域,如:<input type=“hidden”>,服务器在每次响应时将会话状态序列化到隐藏域中,就能在每次接受客户请求时读到他们。
- Cookie。自动在服务器域客户传输。与使用隐藏域一样,可以把会话数据序列化后放到Cookie中。
使用时机
- 可以有效地支持无状态服务器对象;
- 客户会话状态瘦数据量的影响大,大量的数据导致过长的延时。
- 安全问题。所有送到客户的数据都容易泄漏或者被篡改。
服务器会话状态(Server Session State)
运行机制
- 可以把会话数据放到应用服务器内存中,用会话标识号作为键标识;
- 考虑服务器内存,可以把会话数据序列化持久保存起来,但:
- 以什么形式持久化:二进制或者文本如XML
- 持久化到哪。文件系统或者本地数据库,但无法支持集群和故障恢复。共享服务器是个很好的选择。
- 服务器会话状态若存储到数据库中,需要对作废的会话进行处理。
- Java实现
- HTTP会话。缺点无法进行故障恢复。
- 会话bean。需要一个EJB服务器负责持久化和钝化处理。
- .NET实现。容易使用内建的会话状态实现
使用时机
- 服务器会话状态的最大好处就是简单,多数情况下无需编程。
- 需要编程的地方主要在会话维护上。
数据库会话状态(Database Session state)
运行机制
- 客户向服务器发出请求时,服务器要先从数据库中读出请求所需数据,进行处理,然后再将数据存回数据库中;
- 会话状态是会话的局部数据,会话之间彼此区分。
- 会话数据需要和其他数据区分,方法:
- 增加是否是会话数据的判别字段;
- 临时表方法
- 需要一个机制,在会话取消时删除会话数据。
- 数据更新的回滚操作非常复杂。如果在会话中更新了一个允许回滚的订单,回滚如何操作?
使用时机
- 性能:无状态对象可以提高服务器性能,使缓冲和集群变得容易,但在处理请求上要花费时间进行数据库读/写。
- 编程量:无会话数据就不需要编程量,但多数编程都需要处理会话状态。
- 选择数据库会话状态和服务器会话状态时,取决于在特定应用服务器上使用服务器会话便于集群和故障回复的程度。