Servlet容器的会话跟踪

HTTP协议是一种无状态的协议,而对于现在的web应用而言,我们往往需要记录从特定客户端的一系列请求间的联系。现在已经有很多会话跟踪的技术,但是对于程序员而言都不是很方便直接使用。Servlet规范定义了一个简单的HttpSession接口以方便Servlet容器进行会话跟踪而不需要开发者注意实现的细节。一般而言,有两种最常用的会话跟踪机制,一种就是URL重写。在客户端不接受cookie的情况下可以使用URL重写进行会话跟踪。

URL重写包括向URL路径添加一些容器可以解释的数据。规范要求会话ID必须编码在URL路径中,参数名称必须是jsessionid,例如: http://www.myserver.com/catalog/index.html;jsessionid=1234,另一种就是现在最常用的cookie了,规范要求所有的Servlet都必须支持cookie。容器向客户端发送一个cookie,客户端在后续的处于同一个会话的请求中向服务器返回该cookie。会话跟踪cookie的名字必须是JSESSIONID。

新出现的一种会话功能是SSL会话,SSL(Secure Sockets Layer,安全套接字层)是HTTPS协议使用的一种加密技术,内建了会话跟踪功能,Servlet容器可以非常容易的使用这些数据建立会话跟踪。(但是HTTPS不是规范要求Servlet必须支持的协议) 因为HTTP是一种基于请求响应的协议,因此会话只有在客户端加入它以后才被新建立。当会话跟踪信息被成功的返回给服务器以指示会话给建立时客户端才算加入了一个会话。如果客户端没有加入会话,那么下一次请求不会被认为是会话的一部分。如何客户端还不知道会话或者客户端选择不加入一个会话,那么会话被认为是新的。开发者必须自己设计自己的应用中的会话处理状态,在什么地方没有加入会话,什么地方不能加入会话以及什么地方不需要加入会话。

规范要求HttpSession在应用或者Servlet上下文级别有效,诸如cookie这样的建立会话的底层机制可以在上下文中共享,但是对于那些外露的对象,以及更重要的是对象的那些属性是不能在上下文中共享的。对于会话的属性的绑定而言,任何对象都可以绑定到某个命名属性。被绑定的属性对象对于其它处于相同ServletContext并且处于同一个会话处理中的其它Servlet也是可见的。

某些对象在被加入会话或者被从会话中移除时要求得到通知,这样的信息可以通过让该对象实现HttpSessionBindingListener接口得到。该接口定义了两个方法用以标记被绑定到会话或者从会话中被移除。 valueBound方法在对象通过getAttribute之前就被调用,而valueUnbound方法在对象已经不能通过getAttribute得到后才被调用。

相关推荐