· 7.2 会话编程
· 1.会话跟踪程序
会话是起源于同一浏览器上同一用户的一系列请求。使用该会话跟踪框架,服务器就可以保持会话的状态信息。处理会话跟踪的类是 IBMSessionContextImpl (在 IBM 的软件包 com.ibm.Servlet. persona-lization.sessiontracking 中)。缺省情况下,通常由 WebSphere 应用服务器激活它。 IBM 的软件包 com.ibm.servlet.personalization.sessiontracking 包括下列 3 个类和 1 个接口:
字串7
· IBMSessionData (该类扩展了 com.sun.server.http.session.SessionData )
· IBMSessionContextImpl (该类扩展了 com.sun.server.http.session.SessionContextImpl )
· IBMHttpSessionBindingEvent (该类扩展了 Javax.servlet.http.HttpSessionBindingEvent ,并实现了 Serializable ,用于会话群集)
字串9
· IBMHttpSessionBindingListener (扩展了 HttpSessionBindingListener 和 Serializable ,用于会话群集)当用户首次发出请求时,便启用了会话跟踪程序,并创建了 HttpSession 对象,且将会话标识符作为一个 cookie 发送至浏览器。在后继请求中,浏览器将会话标识符作为一个 cookie 送回给用户,会话跟踪程序用它找到与该用户关联的 HttpSession 。当 HttpSession 包含用于实现 IBMHttpSessionBindingListener 的对象时,当实现侦听程序接口的对象与会话连接或断开连接时,会话跟踪程序会通知该对象。由于 HttpSession 对象自己是作为 IBMHttpSessionBindingEvent 的一部分进行传递的,所以 IBMHttpSessionBindingListener 接口允许您在除去会话之前,保存会话的任何部分。这与自动结束会话还是由指定的请求结束会话无关。 字串1
下面说明在集成的 Web 服务器环境中会话跟踪是如何进行工作的: 字串7
(1) 每当用 HttpServletRequest 实现的 getSession 方法获得一个会话时,拥有会话的主机在会话上加一个锁并将会话传播到所需的地方。在任何会话修改和 HttpServletRequest 实现的服务方法结束后,会话将自动发送回服务器以更新会话的副本并释放会话中所加的锁。可以将使用 HTTP 请求获得的会话作为 Servlet 的当前会话或相关联的会话,或是当前 HTTP 请求拥有的会话。
字串2
(2) 还可以用 HttpSessionContext ( IBMSessionContextImpl )实现的 getSession 方法获得会话。 Servlet 可以先访问 HttpSessionContext 实现的 getIds 方法,再用上下文中的 getSession 方法以访问其它几个与 HTTP 请求关联的会话。当用这种方法获得请求时,程序员必须用 IBMSessionContextImpl 的 同步化( synchronized )方法,手工地对会话解锁。同步化方法也会自动更新会话的拥有者主机的版本。 字串7
(3) 当 HttpSessionBindingListener 和 HttpSessionBindingEvent 用于集成的 Web 服务器环境时,在 WebSphere 应用服务器中将在会话驻留的地方激发该事件。如果会话超时,那么这个位置将是拥有者主机。如果通过调用会话对象的无效方法使会话无效,那么该位置可能是会话群集客户机或拥有者主机。如果用 removeValue() 方法除去会话对象,则将在主机上使用调用的地方激发该事件。要提高获取会话无效事件通知单的能力,请使用 IBMHttpSessionBindingListener 和 IBMHttpSessionBindingEvent ,它们提供了设置和检索会话群集客户机或会话群集服务器的主机名时所需的扩展名,以接收通知单。 字串7
(4) 在将 WebSphere 应用服务器的一个实例配置成一个会话群集客户机后,所有其它配置参数(除了启用会话支持参数和会话交换参数)都由指定的会话群集服务器进行访问。参数设置的本地副本保留在会话群集客户机的磁盘上。当会话群集客户机将会话跟踪程序更改为另一总模式时,会话跟踪程序将使用参数设置。这种设计保证了会话群集配置的一致性。
字串7
(5) 在当前的 Java Servlet API (如 Sun Microsystems 指定的)中, HttpSession 接口的 putValue() 方法的定义对集成环境的可能性不做解释。如果添加一个不能实现会话的可串行化接口的对象,则将无法用给定的对象来传播对象。当客户机中做了会话更新时,将不能从群集客户机发送对象至群集服务器。要使应用程序在集成环境中可移动,则必须将所有对象放置在可串行化的会话中。
(6) 在会话群集环境中,添加到会话中的 Java 对象必须在每个群集主机和客户机的 WebSphere 应用服务器类路径中。正如前面所讨论的,这种对象将被串行化(即存储到磁盘上)。
字串6
· 2. 使用 HttpServletRequest 创建会话
字串8
下面结合示例( SessionSample.java ),介绍使用 HttpServletRequest 创建会话的编程技术。示例的程序清单如下: 字串7
import java.io.*;
字串2
import java.util.*; 字串7
import javax.servlet.*; 字串9
import javax.servlet.http.*;
字串6
public
class SessionSample extends HttpServlet { 字串2
public void doGet (HttpServletRequest request, HttpServletResponse response) 字串6
throws ServletException, IOException {
字串1
// 第一步:获取 HttpSession 对象 字串9
boolean create = true; 字串9
HttpSession session = request.getSession(create);
// 第二步:在会话中存储并检索用户定义的数据。
Integer ival = (Integer) session.getValue ("sessiontest.counter");
if (ival == null) ival = new Integer (1);
else ival = new Integer (ival.intValue () 1);
session.putValue ("sessiontest.counter", ival); 字串7
// 第三步:输出一个包含 HttpSesson 对象的数据的 HTML 响应。
![我要研发网[www.51dev.com]](/templets/images/toplogo.gif)
