Web程序运行时,servlet和Web容器之间需要沟通,servlet和servlet之间也需要沟通。HttpServletRequest和ServletRequest接口提供了两种方法:一种是设置属性,也即通过ServletRequest.SetAttribute(),ServletRequest.GetAttribute(),以及removeAttribute()等方法进行设置。这样当SetvletRequest对象在各个servlet间传递的时候,这些属性就可以被这些servlet共享;另一种方法是:“会话”。
一、会话的概念
简单的说,会话就是Web容器将一个客户和这个客户的一系列请求联系起来的一种机制。因为HTTP协议本身是不保持状态的,因此需要附加一种这样的机制以达到现实的需求。这个机制是怎么样的呢?举例来说:Web容器就好像是电影院,浏览器客户就好像是看电影的人,它们之间通过电影票来达到一种关联(同样这个电影票也是有时间期限的)。与看电影一样,当Web客户需要向服务器请求资源时,他必须出示“电影票”。这个“电影票”典型的代表就是Cookie。Web容器通过三种途径实现会话:1.Cookie机制 2.URL重写 3.隐藏表单输入。其中Cookie是Web服务器发送给Web客户的一串数据,浏览器在向Web服务器发送请求时,需要附带上这个Cookie,以使服务器可以验名身份。URL重写是将会话代码附加在URL中的方式。隐藏表单输入是通过HTML表单的hidden无素来实现。需要注意的是以上三个实现会话的方法默认情况下都没有安全机制,Cookie,URL,隐藏表单的数据都是可以很容易查到的。因此,如果会话编码需要保密,Web程序应使用加密或SSL连接等安全机制以保证数据安全。
二、处理Cookie
Servlet API的javax.servlet.http.Cookie类用来创建和处理cookie,可以使用HttpServletResponse的addCookie(Cookie)来向浏览器发送cookie。一个cookie可以有这些属性:名称,值,注释,路径,域名,最大年龄,版本号等。其中,除了名称和值外,其它属生是可选的。在使用addCookie方法向浏览器发送cookie时,其时就是在HTTP响应的头信息中增加一行以下格式的数据:
Set-Cookie:Name=Value; Version={version};Comment={comment};Domain={domain};Max-Age={age};Path={path}
在浏览器向服务器再次返回请求时,它会将先前此服务器发送给他的Cookie附带返回给服务器,这时Web服务器就可以通过HttpServletRequest.getCookie()方法取得cookie,此方法返回的是Cookie对象。
整个Cookie处理的过程代码就好像这样:
1.服务器响应,产生Cookie
Cookie ck = new Cookie('ckname','ckvalue');
HttpServletResponse.setCookie(ck);
2.服务器接收到浏览器的请求
Cookie[] cks = HttpServletRequest.getCookie();
cks[0].getvalue();
......
具体的Cookie类属性和方法参考Servlet JavaDoc。
三、使用HttpSession
HttpSession是利用cookie原理实现的更上一层的会话,一个HttpSession对象就表示一个会话。它的典型应用场景如下:
public void doGet(HttpServletResquest req,HttpServletResponse resp) throws ServletException,IOException
{
HttpSession hs = req.getSession(true);//取得当前请求所属的会话,若当前没有会话且参数为true则产生一个新的会话。
hs.getAttribute("atbtName");//取得会话hs的一个属性atbtName的值。
hs.setAttribute("atbtName",atbtValueObject); //增加或设置一个会话属性,其值为一个对象引用。
}
详细的关于HttpSession接口的说明参考Javadoc。
有一点需要说明的是,另然Cookie和HttpSession都可以实现会话,但两者是有区别的,区别在于HttpSession处于更抽象的一层,使用起来更简便。更重要的一点是,HttpSession的属性存储的是对象的引用,而且存储在Web服务器端,因此,具有更大的使用弹性。而cookie是存储于浏览端,且不同的浏览器对Cookie都有不同的限制,如个数限制等。因此,使用HttpSession来管理会话更为直观和方便。