Tomcat教程

控制会话

HTTP会话是单一浏览器与Web服务器(如Tcmcat)之间的一串交互(例如Web浏览器实例)。servlet规范定义了临时存放用户信息的HttpSession对象,包括唯一会话标识符 及参照的Web应用程序存储的Java对象,以作为会话的属性。典型的会话应用示例包括 购物车及需要用户签到的网站9通常,会话在用户闲置的一个可配置周期之后被设为® 时.用户闲置(user inactivity)被定义为暂停属于HTTP会话的请求。一旦会话超时,也 就是说“无效的会话”,如果用户对网站发出新的HTTP请求,则通常必须通过重新登 陆以创建新的、有效的会话。

Tomcat具备可插入式session Managers (会话管理器),可以控制处理会话的逻辑,并且 有session Store以储存及加载会话。并非所有的Manager都会使用Store来延续会话。使 用Store接口以提供可插入式的会话储存能力是实现的选项。不论是否使用Store接口, 功能强大的session Manager都会替其会话实现某种持续性的储存机制。指定Manager的实 现与指定Realm的方式十分类似:

<Manager className="some.manager.implementation.className" 
customAttribute1="some custom value" 
customAttribute2="some other custom value"/>

几乎所有的会话控制都被交给了Manager及Store对象,不过有些选项则仍在web.xml中设 定(即在comcxt层)。

会话的持续性

会话的持续性(persistence)是指在关闭服务器时将HTTP会话保存(延续)于硬盘中, 以及当重启服务器时对应重载的机制。如果没有会话的持续性,则重启服务器会导致丢 失所有现行用户会话。对用户而言,这表示要求他们再次登录(若使用容器管理的安全 防护机制),而且可能会丧失之前正在浏览的网页,以及任何购物车信息,或存储于会话中的其他网页状态信息。延续该信息可确保其不会丢失。

如果需要永久储存用户信息,则需将其存入关系型数据库、LDAP目录或硬盘上自定义 的文件中。

StandardManager

当server.xml文件中未明确配置时,StandardManager就是默认的Manager。Standard-Manager不会使用任何Store。它具有能将所有会话持续性存储在文件系统上的内嵌程 序代码,而且只有当Tomcat正常停止时才会这样处理&它将会话序列化(serialize) 到Web应用程序工作目录下(请查阅$CATAUNA_HOME/work/Cata/lina/<hostname>/<webapp-name>/目录)的一个叫做SESSIONS.ser的文件中。当Tomcat重启动时, Standair-dManager会从该文件中重载这些会话,然后删除该文件,因此一旦Tomcat 启动结束,就无法在硬盘上找到该文件了。当然,如果突然终止该服务器(例如,在非Windows操作系统上使用kill-9、系统崩溃等),则所有会话都将丧失,因为 StandardManager没有机会实现存盘处理。表2-5列出了StandardManager的属性。

表2-5:StandardManager 的属性

属性含义
className使用的Manager实现名。对于StandardManager,必需将其设为org.apache.catalina.session. StandardMaragers。
distributableservlet规范定义了“分布式”web应用程序的特殊行为,并定义了关于会话数据管理是否启用或禁用这一行为。对给定的Web应 用程序,该厲性值是从Web应用程序的WEB-INF/web.xml文件继 承而得到的。如果被标记为<distributable/>,那么该 属性值被设置为true,否则为false。如果该标志被设为true,则 与该管理器相关的被添加到会话中的所有用户数据对象必须实现 java.io.Serializable,因为这些会话必须被序列化,并将其发送到运行其他Tomcat JVM的其他机器上。虽然StandardManager 没有使用这一属性,但可以将这一属性用于其他Manager实现。
maxActiveSessions可允许现行会话的最大数,或者采用默认值-1,代表会话数无限制。
maxInactiveInterval该Manager所创建的会话的默认最大闲置间隔(以秒为单位),默认值为60。
pathname当Tomcat停止时,此Manager储存现行会话的文件名或路径,而当Tomcat启动时,会从此文件加载这些会话。如果未设定,则默认值为SESSIONS.ser。如设为空值,则表示不需要会话的持续 性。如果此路径名为相对路径,则会依据范围所提供的临时工作目录来解析,可靠情况下是通过javax.servlet.context.tempdir 的context属性来获取。
processExpiresFrequency该属性定义了Tomcat进程会话有效期的挑战性(aggressively)。将该值设为低值(最小值为1),使Tomcat有效期的更具挑战 性,而设置为高值则使其挑战性更小。将该值设得越小,则会 话效期时限(erpiration timeliness)耗用CPU的时间越多,因此, 在负荷很重的服务器上,您尽可能将其设置为一个较髙值。有关 会话效期时限的问题,是一个错综复杂的问题。默认值是6。
algorithm这一Manager用于产生会话标识符所使用的摘要算法消息。有效值括SHA, MD2或MD5。默认值是MD5。
entropy可以将此设为任何字符串,而它会用干用数字产生随机数生成器的种子,随机数生成器与摘要算法联合使用,能产生安全的随机 会话标识符,默认值是Manager类名的字符串表示。
randomClass随机数产生器的类名。默认值是java.security.SecureRandom。
sessionIdLength该属性设置了Manager产生的会话ID值的长度,不包含任何加载均衡的JVM路由信息,默认值是16。

以下的StandardManager示例会使已闲置两小时的会话超时:

<Manager className="org.apache.catalina.session.StandardManager" 
		 maxInactiveInterval="7200"/>

PersistentManager

另外一个可供使用的Manager是PersistentManager,它将会话存入sessions Store,这样 做使得意外死机时仍能提供会话持续性D PersistentManager还在试验阶段,Tomcat默认不会使用它。

org.apache.catalina.session,PersistentManager类会实现完整的持续性管理。它必须与Store元素一起使用,以告知在何处储存会话,所支持的存储位置包括文件及JDBC数 据库。

<Manager className="org.apaclre.catalina.session.PersistentManager"
saveOnRestart="true”>
<Store className="org.apache.catalina.session.Filestore"/> 
</Manager>

使用Filestore储存会话

以下示例示范了在server.xml文件中如何配置PersistentManager,以便使用Filestore:

<Manager cld&sName="org.apache.catalina.session.PersistentHanager" 
saveOnRestart="true">
<Store className="org.apache.catalina.session.Filestore" 
directory="/home/jasonb/tomcat-sessions"/>
</Manager>

如杲决定将上面的diTectory属性设定为自定义值,请确定将其设为现存的目录,且运行 Tomcat的用户对该目录有读/写文件的权限。表2-7列出了 Filestore的属性。

表2-7: Filestore的厲性

属性意义
className所用的Store类名;对于Filestores,必须设置该属性为org.apache.catalina.session.Filestore for。
directory存放会话的目录的文件系统路径名。这可以是绝对路径,或者是相对于此Web应用程序的临时工作目录的相对路径。
checkIntervalFileStore的后台线程检査超时会话的时间间隔(以秒为单位)。默认值是60。

Filestore会将各个用户的会话(包括所有的会话属性对象)存入文件系统中。每一个 会话会存入称为<session ID>的文件中。例如,4FF8890ED8A53D6B.session。每当PersistentManager提出要求时,Filestore都会载人并储存这些会话。在Tomcat关闭时,如果有会话被保存,而同时该会话又超时了(在Tomcat未运行时),那么该 Filestore将无效,而且Tomcat再度运行时会删除该无效的会话。

使用JDBCStore储存会话

以下示例示范了如何在server.xml文件中设定Persistentmanager,以使用JDBCStore:

<Manager className="org.apache.catalina.session.PersistentManager" 
         saveOnRestart="true">
       <Store className="org.apache.catalina.session.JDBCStore" 
       	driverName="com.mysql.jdbc.Driver"
       	 connectionURL="jdbc:mysql://localhost: 3306/mydb?user=jb; password-pw"/>
</Manager>

在启动Tomcat前,必须设置数据库,从而使JDBCStore能够登录数据库并具有读取会话表的权限。具有典型代表性的表结构如下所示:

create table tomcat$sessions (
id	         varchar(64) not null primary key,
data	       blob
valid	       char(1) not null,
maxinactive  int not null,
lastaccess bigint not null,
);

可以给上面的表及字段取不同的名。如果不指定不同的表名或字段名,那么上例反映了JDBCStore默认使用的字段及表名。表18列出了JDBCStore的属性:

表2-8: JDBCStore的属性

属性意义
classNameStore类所用的名称。对于JDBCStore必须设为org.apache.catalina.session.JDBCStore
driverNameJDBC驱动程序所用的完整Java类名。默认为oig.apache.catalina.session.JDBCStore
connectionURL所用的JDBC连接URL
sessionTable数据库中会话表的名称。默认为tomcat$sessions
sessionIdCol会话表中会话ID的字段名。默认值是id
sessionDataCol会话表中会话数据列名。默认值是data
sessionValidCol会话表中储存会话有效性的字段名称。默认值是valid
sessionMaxInactiveCol会话表中储存会话最大闲置时间间隔的字段名,默认值是maxinactive
sessionLastAccessedCol会话表中储存会话上次访问时间的字段名。默认慎是lastaccess
checkIntervalJDBCStore的后合线程检査超时会话的时间间隔(以秒为单位)。默认值是60

关注微信获取最新动态