HTTP会话使用与管理(一)(java web学习系列)

多数Web应用,如购物网站、电子邮箱等,服务器必须能够追踪客户状态。Web服务追踪客户状态常用方法如下:

在HTML表单中插入隐藏字段,包含客户状态数据;

重写URL,使url包含客户状态数据;

使用Cookie来传送用于追踪客户状态数据;

使用会话机制(Session)。

Http协议是无状态的,每次客户请求访问Web服务端的一个网页时,都必须与服务器建立一个FTP连接,然后再发送HTTP请求。在HTTP请求中加入额外用于追踪客户状态数据可以使服务器能够区分不同客户,以及避免服务器重启或者客户长时间未活动再次访问应用造成客户当前操作信息丢失等,提高应用的客户体验。

会话机制是Web开发领域用于追踪客户状态的普遍解决方案,会话是指一段时间内,单个客户与Web应用的一连串交互过程。

Web领域的会话也称HTTP会话,但会话并不是由HTTP协议制定(Http是无状态的)。Servlet规范制定了基于java会话的具体运作机制。在ServletAPI中定义了代表会的的javax.jttp.HttpSession接口,Servlet容器并需实现该接口。一次会话对应一个HttpSession对象,HttpSession对象由Servlet创建(应用servlet对象由Servlet容器创建),该对象可以存放客户状态信息,Servlet容器为每一个HttpSession对象分配一个唯一标示符,SessionID.

HttpSession生命周期:

(1)创建时期,客户首次访问支持会话应用或再次访问会话销毁的应用,Servlet容器会创建新的HttpSession对象;

(2)活动时期客户一系列连续的请求访问;

(3)会话销毁(浏览器进程终止、执行HttpSession对象invalidate()方法、会话过期)。

HttpSession对象访问,jsp中可以直接通过jsp隐式对象session直接访问,HttpSevlet类中可以通过HttpServletRequest对象来获取HttpSession对象。

重写URL来追踪会话,Servlet容器会在客户端浏览器保存一个SessionID,以后浏览器发出的HTTP请求就会包含这个ID,Servlet容器读取HTTP请求中ID,判断来个各个浏览器请求属于哪个会话的过程即为会话追踪。如浏览器支持Cookie,Servlet容器就把SessionID作为Cookie保存在浏览器中,但出于安全原因许多浏览器禁用Cookie,此时Servlet将采用另一只方式来追踪会话:重写URL,把SessionID添加到URL信息中,HttpServletResponse接口提供了该方法--publicjava.lang.StringencodeURL(Stringurl)。

//修改前

<ahref="weblogin.jsp"></a>

//修改后

<ahref="<%=response.encodeURL("weblogin.jsp")%>"></a>

encodeURL方法执行过程,(1)先判断weblogin.jsp是否支持会话(jsp文件可以通过声明<%@pagesession="false"%>来指定页面不支持会话),此时链接依然为

<ahref="weblogin.jsp"></a>;(2)判断浏览器是否支持Cookie,如支持就直接返回参数指定的URL,如不支持Cookie就在参数指定URL前添加SessionID信息,然后返回修改后的URL.此时URL链接形式如下<ahref="weblogin.jsp;jsessionid=965436346445F01991DB6F68F"></a>

会话持久化,在某些情况下Servlet容器将HttpSession对象从内存中转移到永久性存成设备中,在需要访问得时候再将它们加载到内存的这一过程即为会话持久化。会话持久化好处:

(1)节约内存空间,假设Web应用有万级用户时,在Servlet容器中会生成上万个HttpSession对象,如果将这些对象一直放在内存中,将耗费大量内存资源,因此将处于不活动状态下的Session对象转移到永久设备中,这样能提高对内存资源的利用率。(2)确保在服务器重启或者单个web应用重启后,能够恢复重启前会话。这样可以再服务器出现故障重启,客户再次访问应用可恢复重启前的操作信息,这样可以提高应用用户体验。

把Seesion对象保存到永久性设备,采用了java对象序列化技术。在持久化会话时,Servlet容器不仅会持久化HttpSession对象,还回持久化所有可以序列化的属性,从而确保存放在会话范围内的共享数据不会丢失。其中序列化属性即为属性所属的类实现了java.io.Serializable接口(类必须实现该接口,否则在持久化HttpSession对象时不会持久化存放HttpSession该类对象)。会话在其生命周期中,可能会在运行时和持久化状态转换,运行时即为Session对象位于内存中(含活动状态、不活动状态),持久化状态主要特征为HttpSession对象位于永久性设备中。

HttpSession从运行时状态转化为持久化状态过程称为搁置。当服务器终止或者单个web应用终止时,会话处于不活动状态时间太长,达到限定值,WEB应用中处于运行时会话太多,达到特定限定值情况下会话将会被搁置。HttpSession从持久化状态转化为运行时状态过程称为激活。当服务器重启或者单个应用重启时,应用中会话被激活;处于会话浏览器向应用发送http请求,相应会话被激活。

会话的搁置和激活对客户端来说是透明的,当客户端与服务端交互时,客户端感觉上会认为会话始终处于运行时状态。

javaServletAPI并没有为会话持久化提供标准接口,会话持久化完全依赖Servelt容器的具体实现。如,tomcat采用会话管理器来管理会话,相关帮助文档路径为:

<CATALINA_HOME>webapps/docs/config/manager.html。tomcat的会话管理器包含org.apache.catalina.session.StandardManager类(标准会话管理器)和org.apache.catalina.session.PersistentManager类(提供更多灵活的管理会话功能)。

标准会话管理器StandardManager,StandardManager是默认会话管理器。实现机制为:当tomcat服务器终止或者单个应用终止时,会对被终止的web应用的HttpSession对象进行持久化,把它保存在永久文件中:<CATALINA_HOME>/work/catalina/[hostname]/[application]/SESSION.ser

持久化会话管理器PersistentManager,提供更多灵活会话管理功能,它把存放会话对象的永久性设备成为会话Store。PersistentManager具体以下功能:

(1)当tomcat服务器终止或者单个应用终止时,会对被终止的web应用的HttpSession对象进行持久化,把它保存在Store中。

(2)具有容错功能,及时把HttpSession对象备份到会话Store中,当服务器意外关闭后在重启,可以从Store中恢复会话。

(3)可以灵活控制内存中会话对象数目,将部分会话对象转移到会话Store中。

tomcat中会话Store的接口为org.apache.Catalina.Store并提供了两个实现该接口的类。

org.apache.Catalina.FileStore和org.apache.Catalina.JDBCStore.

相关推荐