Sun Java System Application Server 7 Web应用开发者指南

上一部分 | 目录 | 下一部分


创建和管理用户会话

本模块介绍了如何创建和管理会话,使得用户和事务信息之间的交互具有持续性。

该模块包含以下各节:

介绍会话

用户会话一词指的是服务器跟踪的一系列用户应用交互。一般主要用会话来维护许多交互过程中的用户特定信息,包括持久性对象(如EJB组件句柄或数据库结果集)和认证过的用户标识。例如,可以使用会话来跟踪一个合法的用户登录以及该特定用户登录后的一系列有向活动。

会话本身是保存在服务器上的。每次申请会话时,客户端发送cookie中的会话ID,如果浏览器不允许使用cookie,服务器会自动将会话ID 写入URL

Sun Java System Application Server 支持servlet标准会话接口,即HttpSession,对于所有的会话活动都可以使用该接口。你能够利用该接口编写简短、安全的servlet

会话和Cookie

cookie是一个较小的信息集合,可以将它传送给调用它的浏览器,浏览器在后面的每次调用中都会检索它,这样服务器能够识别出这些调用是不是来自于同一个客户端。每次调用之后,cookie都会返回到创建它的站点上。

会话是由第一次创建的时候发送到客户端的会话cookie自动维护的。会话cookie包括会话ID,通过该ID识别每次客户端到服务器的连续交互。如果客户端不支持或允许cookie,服务器重写URL,会话ID出现在该客户端的URL上。

你可以配置会话是否要使用cookie以及如和使用。查看sun-web.xml文件中的session-properties和cookie-properties元素,具体介绍见"装配和部署Web组件"。

会话和URL重写

在两种情况下Sun Java System Application Server 插件将使用隐式URL重写:

  • 当来自Sun Java System Application Server的响应返回时;如果选择了隐式URL重写,那么在将响应发送给客户端之前 插件会重写响应中的URL
  • 当不需要将客户端提出的请求发送到Sun Java System Application Server,并能够在web服务端服务时。 这类请求可能出现在会话中间,并且可能需要重写响应。

你可以配置会话要不要使用URL重写。查看sun-web.xml文件中的session-properties元素,具体介绍见 "装配和部署Web组件"

会话和安全

Sun Java System Application Server 安全模型基于一个认证的用户会话。 一旦创建了会话,认证应用用户 (如果使用了认证) 并且将信息登记到会话中。每个接收EJB请求的servlet在交互阶段完成两件事情:产生JSP的内容并格式化输出,并且检查用户认证是否正确。

另外,可以规定会话cookie只能在安全连接中传递(HTTP),所以会话只能在安全通道中才处于活动状态。

如果想获得关于安全的更多信息,请查看"Web应用安全性"

如何使用会话

要使用会话,首先要使用HttpServletRequest 的方法getSession()创建一个会话。建立会话之后,使用给定的方法查看和设置它的属性。如果需要,还可以设置会话,让它在处于非活动状态一个预定义的时间后自动超时,也可以手动使它无效。也可以将对象和存储它们供其它组件使用的会话绑定起来。

创建或访问会话

使用HttpServletRequest 的方法getSession()创建新的会话或访问现有会话,如下所示:

HttpSession mySession = request.getSession();

getSession() 返回请求的有效的会话对象,通过封装在请求对象中的会话cookie来识别。如果不存在跟请求相关的会话,那么不带任何参数调用该方法就会创建一个会话。另外,调用带有布尔参数的该方法时,只有当该参数是true时才创建会话。

下面的例子显示了servletdoPost() 方法,如果会话存在,该方法仅执行servlet的主函数。注意,如果会话不存在,getSession() false 参数禁止创建新会话。

public void doPost (HttpServletRequest req,
                  HttpServletResponse res)
            throws ServletException, IOException
{
   if ( HttpSession session = req.getSession(false) )
   {
      //
会话检索,继续servlet操作
   }
   else
      //
没有会话,返回一个错误页

   }
}


注意

在将信息写入响应流之前,应该先调用getSession() 方法。否则SetCookie 字符串就存放在HTTP响应体中而不是HTTP header中。


如果想获得getSession()的相关信息,请查看Java Servlet Specification v2.3

检查会话属性

一旦建立了会话ID,使用HttpSession 接口中的方法检查会话属性,使用HttpServletRequest 接口中的方法检查会话相关的请求属性。

下面的表格显示了检查会话属性的方法。左列是HttpSession 方法,右列是对这些方法的描述。

HttpSession 方法

  HttpSession 方法

描述

GetCreationTime()

返回建立会话的时间,这个时间表示为自1970-1-100:00:00GMT)以来的毫秒数。

getId()

返回分配的会话标识符。HTTP会话标识符是一个唯一字符串,由服务器创建并维护。 

getLastAccessedTime()

返回客户端最后一次发出与这个会话有关的请求的时间,如果这个会话是新建立的,返回-1。这个时间表示为自1970-1-1日(GMT)以来的毫秒数。  

isNew()

返回一个布尔值以判断这个会话是不是新的。如果一个会话已经被服务器建立但是还没有收到相应的客户端的请求,这个会话将被认为是新的。这意味着,这个客户端还没有加入会话或没有被会话公认。在它发出下一个请求时还不能返回适当的会话认证信息。 

例如:

String mySessionID = mySession.getId();
if ( mySession.isNew() ) {
   log.println(currentDate);
   log.println("client has not yet joined session " + mySessionID);
}

下面的表格显示了检查servlet请求属性的方法。左列是HttpServletRequest 方法,右列是对这些方法的描述。

  HttpServletRequest 方法 

 HttpServletRequest 方法

描述

getRemoteUser()

返回作了请求的用户名(使用该信息进行HTTP用户认证。)
如果请求中没有用户名信息,这个方法返回空值。 

getRequestedSessionId()

返回该请求相应的会话ID。如果由于某种原因客户端提供的会话ID是无效的,这个会话id将与在当前会话中的会话ID不同,与此同时,将建立一个新的会话。如果该请求没与一个会话关联,该方法返回空值。

isRequestedSessionIdValid()

该方法检查此请求是否与一个当前有效的会话关联。如果当前请求中使用的会话无效,它将不能通过getSession方法返回。

isRequestedSessionIdFromCookie()

如果这个请求的会话ID是由客户端的cookie提供的,该方法返回真,否则返回假。 

isRequestedSessionIdFromURL()

如果客户端提供的该请求的会话IDURL的一部分,该方法返回真,否则返回假。

例如

if ( request.isRequestedSessionIdValid() ) {
   if ( request.isRequestedSessionIdFromCookie() ) {
      //
该会话由会话cookie维护
   }
   //
任何其它需要有效会话的任务
} else {
   //
登记应用错误
}

给会话绑定数据

可以将对象绑定到会话上,这样在多个用户交互中就能使用它们。

下面的表格显示了HttpSession 方法,它们支持将对象绑定到会话对象。左列是HttpSession 方法,右列是对这些方法的描述。

   HttpSession 方法

HttpSession 方法

描述

getAttribute()

返回绑定到给定名字的会话的对象,如果没有这样的绑定,就返回空。 

getAttributeNames()

返回绑定到会话的所有属性的名字。

setAttribute()

将指定的对象绑定到给定名字的会话上。会覆盖任何已有的同名绑定。如果要将绑定到会话的对象发布出去,必须要实现serializable 接口。 

removeAttribute()

解除给定名字的会话中绑定的对象。如果没有对象绑定到给定名字的会话,该方法就不执行任何操作。 

HttpSessionBindingListener 绑定通知

某些对象在被加入会话或者被从会话中移除时要求得到通知这样的信息可以通过让该对象实现HttpSessionBindingListener接口得到。当应用在会话中存储或移除数据时,servlet引擎会检查绑定或解绑的对象有没有实现HttpSessionBindingListener。如果实现了,Sun Java System Application Server 就会通过HttpSessionBindingListener接口通知在考虑范围的对象 ,它跟会话绑定或解绑了。

使会话无效

当会话处于非活动状态超过一段时间后,指定会话自动无效。也可以手动使用HttpSession 的方法invalidate()让会话无效。


提示

会话API没有提供显式的会话退出API,所以要实现任何退出必须调用session.invalidate() API


手动让会话无效

手动让会话无效,只要调用下面的方法:

session.invalidate();

所有和会话绑定的对象都从会话中移除。

设置会话超时

使用sun-web.xml 部署描述符文件设置会话超时。如果想获得更多信息,请查看“装配和部署Web组件”中的 session-properties 元素。

会话管理器

开始一个新会话的时候,会话管理器会自动创建新的会话对象。在一些环境中,客户端并不加入会话,例如,会话管理器使用cookie而客户端不接受cookie

Sun Java System Application Server 7提供了下面这些会话管理选项:


注意

会话管理器接口是不稳定的。一个不稳定的接口仅是作为实验或过渡用的,因此有可能会改变、删除或被下一发行版本中的更加稳定的接口替换。


StandardManager

StandardManager 是默认的会话管理器。

启动StandardManager

你可能希望指定StandardManager 显式改变它的默认参数。要做到这一点,编辑Web应用的sun-web.xml 文件,如下所示:

<sun-web-app>
   ...
   <session-config>
      <session-manager>
         <manager-properties>
            <property name="reapIntervalSeconds" value="20" />
         </manager-properties>
      </session-manager>
      ...
   </session-config>
   ...
</sun-web-app>

如果想获得关于sun-web.xml 文件的更多信息,请查看"装配和部署Web组件"

StandardManager的管理器属性

下面的表格描述了StandardManager 会话管理器的manager-properties 属性。左边一列是属性名字,中间一列显示了默认值,右边一列具体描述了属性的作用。

manager-properties属性

属性名

默认值

描述

ReapIntervalSeconds

60

指定了检查会话有没有过期的间隔时间。

将该值设置成小于推荐的会话数据改变频率。例如访问率很高的网站上的点击计数器servlet的这个值必须尽可能低(1秒),否则,在每次重启服务器时,有可能会丢失最新的几次点击。 

MaxSessions

-1

指定了处于活动状态的会话的最多数目,如果设置成-1 (默认值)就没有限制。 

sessionFilename

没有,重启时不保留状态。

如果能够保留状态,该属性指定保留应用重启时的会话状态的文件的相对或绝对路径名。相对路径名是相对于该web应用的临时目录。 

PersistentManager

PersistentManager Sun Java System Application Server 提供的另一个会话管理器。对于持久性会话, PersistentManager 可以使用一个文件,序列化每个会话。你可以创建自己的持久性机制。

启动PersistentManager

你可能希望明确地指定PersistentManager 使它能改变它的默认参数。要实现这一点,编辑Web应用的sun-web.xml 文件。如下面的例子所示。注意必须将persistence-type 设置成file

<sun-web-app>
   ...
   <session-config>
      <session-manager persistence-type=file>
         <manager-properties>
            <property name=reapIntervalSeconds value=20 />
         </manager-properties>
         <store-properties>
            <property name=directory value=sessions />
         </store-properties>
      </session-manager>
      ...
   </session-config>
   ...
</sun-web-app>

如果想获得sun-web.xml文件的更多信息,参见 装配和部署Web组件

PersistentManager的管理器属性

下面的表格描述了PersistentManager 会话管理器的manager-properties 属性。左列是属性名,中间一列是默认值,右边一列描述了属性的作用。

manager-properties属性

属性名

默认值

描述

reapIntervalSeconds

60

指定了检查会话有没有过期的间隔时间。

将该值设置成小于推荐的会话数据改变频率。例如,访问率很高的网站上的点击计数器servlet的这个值必须尽可能低(1秒),否则,在每次重启服务器时,有可能会丢失最新的几次点击。 

MaxSessions

-1

指定了处于活动状态的会话的最多数目,如果设置成-1 (默认值)就没有限制。 

PersistentManager的存储属性

下面的表格描述了PersistentManager 会话管理器的store-properties属性。左列是属性名,中间一列是默认值,右边一列描述了属性的作用。

store-properties属性

  属性名

默认值

描述

ReapIntervalSeconds

60

指定检查会话是否过期的时间间隔,单位是秒,这些会话当前处于换出状态。

将该值设置成小于推荐的会话数据改变频率。例如,访问率很高的网站上的点击计数器servlet的这个值必须尽可能低(1秒),否则,在每次重启服务器时,有可能会丢失最新的几次点击。  

Directory

javax.servlet.context.temp dir 指定的目录上下文属性 

指定单个会话文件保存的绝对或相对目录的路径名。相对路径相对于该web应用的临时工作目录。



上一部分 | 目录 | 下一部分

 

常见问答
下载中心
产品简介
 
 
Solaris论坛
 
   
 
null