J2EE 应用程序通常具有大量会话状态数据。Web 购物车是一个典型的会话状态示例。此外,应用程序可以高速缓存会话对象中需要频繁使用的数据。事实上,几乎带有重要用户交互的所有应用程序都需要维护会话状态。
要使用 asadmin 启用和配置 Web 容器的可用性,请参见 configure-ha-persistence(1)。
或者,使用 asadmin set 命令将配置的 availability-service.web-container-availability.availability-enabled 属性设置为 true,然后使用 configure-ha-persistence 根据需要设置属性。
例如,按如下所示使用 set 命令,其中 config1 为配置名称:
asadmin set --user admin --passwordfile password.txt --host localhost --port 4849 config1.availability-service.web-container-availability.availability-enabled="true" asadmin configure-ha-persistence --user admin --passwordfile secret.txt --type ha --frequency web-method --scope modified-session --store jdbc/hastore --property maxSessions=1000:reapIntervalSeconds=60 cluster1 |
在树组件中,选择所需配置。
单击“可用性服务”。
选择“Web 容器可用性”选项卡。
选中“可用性服务”框以启用可用性。要禁用可用性,请取消选中该框。
更改其他设置,如下一节可用性设置所述。
重新启动服务器实例。
通过“可用性服务”的“Web 容器可用性”选项卡,您可以更改这些可用性设置:
持久性类型:指定已启用可用性的 Web 应用程序的会话持久性机制。允许的值包括 memory(无持久性)、file(文件系统)和 ha (HADB)。
在使用 ha 会话持久性之前,必须先配置和启用 HADB。有关详细配置信息,请参见 configure-ha-cluster(1)。
如果启用了 Web 容器可用性,则默认值为 ha。否则,默认值为 memory。对于需要会话持久性的生产环境,请使用 ha。前两种类型(memory 和 file 持久性)不提供高可用性会话持久性。
持久性频率:指定存储会话状态的频率。仅当持久性类型为 ha 时适用。允许的值包括:
web-method-将响应发送回客户机之前,将在每个 Web 请求结束时存储会话状态。此模式为发生故障时完全更新会话状态提供了最好的保证。这是默认选项。
time-based-在后台按照 reapIntervalSeconds 存储属性设置的频率存储会话状态。此模式不能保证完全更新会话状态。但是,它可以提供很大的性能改善,因为在每个请求之后都不存储状态。
持久性范围:指定会话对象的数目和存储会话状态的频率。仅当持久性类型为 ha 时适用。允许的值包括:
session-每次都存储整个会话状态。此模式为正确存储任何可分发 Web 应用程序的会话数据提供了最好的保证。这是默认选项。
modified-session-如果会话状态已被修改,则存储整个会话状态。如果调用了 HttpSession.setAttribute() 或 HttpSession.removeAttribute(),则系统将认为会话状态已被修改。您必须保证每次更改属性时都调用 setAttribute()。这不是 J2EE 规范的要求,但是此模式需要这样做才能正常工作。
modified-attribute-仅存储修改后的会话属性。要使此模式正常工作,您必须遵循一些指导原则:
每次修改会话状态时都调用 setAttribute()。
确保各属性之间没有交叉引用。系统将对每个不同的属性关键字的对象图形单独进行序列化并单独存储。如果每个单独的关键字下的对象之间有对象交叉引用,则它们将不会被正确序列化和反序列化。
在多个属性之间分布会话状态,或者至少在只读属性和可修改属性之间分布会话状态。
单点登录状态:选中此框以启用单点登录状态的持久性。要禁用可用性,请取消选中该框。有关更多信息,请参见结合使用会话故障转移和单点登录。
HTTP 会话存储:如果更改了用于连接 HADB 的 JDBC 资源以获得会话持久性,您可以更改 HTTP 会话存储。有关详细信息,请参见 configure-ha-cluster(1)。
要启用和配置单个 Web 应用程序的可用性,请编辑应用程序部署描述符文件 sun-web.xml。应用程序的部署描述符中的设置将覆盖 Web 容器的可用性设置。
session-manager 元素的 persistence-type 属性用于确定应用程序使用的会话持久性的类型。必须将其设置为 ha 以启用高可用性会话持久性。
有关 sun-web.xml 文件的更多信息,请参见《Sun Java System Application Server Enterprise Edition 8.1 2005Q2 Developer’s Guide》中的“The sun-web.xml File”。
<sun-web-app> ... <session-config> <session-manager persistence-type=ha> <manager-properties> <property name=persistenceFrequency value=web-method /> </manager-properties> <store-properties> <property name=persistenceScope value=session /> </store-properties> </session-manager> ... </session-config> ...
在单个应用程序服务器实例中,如果一个应用程序验证了用户,则运行在同一个实例上的其他应用程序不会对用户进行重新验证。这称为单点登录。有关更多信息,请参见《Sun Java System Application Server Enterprise Edition 8.1 2005Q2 Developer’s Guide》中的“User Authentication for Single Sign-on”。
为了使 HTTP 会话故障转移到群集中另一个实例后该功能仍然可用,必须将单点登录信息保留在 HADB 中。要保留单点登录信息,请首先启用服务器实例和 Web 容器的可用性,然后启用单点登录状态故障转移。
通过管理控制台中的“可用性服务”的“Web 容器可用性”选项卡,您可以启用单点登录状态故障转移,如为 Web 容器配置可用性中所述。您也可以使用 asadmin set 命令将配置的 availability-service.web-container-availability.sso-failover-enabled 属性设置为 true。
例如,按如下所示使用 set 命令,其中 config1 为配置名称:
asadmin set --user admin --passwordfile password.txt --host localhost --port 4849 config1.availability-service.web-container-availability. sso-failover-enabled="true"
可以通过单个名称和密码的组合进行访问的应用程序组成了单点登录组。对于与应用程序(是单点登录组的一部分)相对应的 HTTP 会话,如果其中一个会话超时,其他会话并不会失效,并且仍然可用。这是因为一个会话的超时不应影响其他会话的可用性。
作为这个行为的推论,如果一个会话超时并且您尝试从运行该会话的同一浏览器窗口访问相应的应用程序,则您无需再次进行验证。但是,将创建一个新的会话。
以属于含有其他两个应用程序的单点登录组的购物车应用程序为例。假设其他两个应用程序的会话超时值大于购物车应用程序的会话超时值。如果购物车应用程序的会话超时,并且您尝试从运行该会话的同一浏览器窗口运行购物车应用程序,则您无需再次进行验证。但是,前一个购物车将丢失,并且您必须创建一个新的购物车。即使运行购物车应用程序的会话已超时,其他两个应用程序也会继续照常运行。
类似地,可假定与其他两个应用程序中的任何一个应用程序对应的会话超时。当从运行该会话的同一浏览器窗口连接应用程序时,您无需再次进行验证。
此行为仅适用于会话超时情况。如果启用了单点登录并且您使用 HttpSession.invalidate() 令其中一个会话失效,则属于单点登录组的所有应用程序的会话都将失效。如果您尝试访问属于单点登录组的任一应用程序,则需要再次进行验证,系统将为访问该应用程序的客户机创建一个新的会话。