高春庚
(济源职业技术学院信息工程系 河南 济源 459000)
由于HTTP协议是无状态协议,服务器对用户的请求进行响应后,就会关闭与该客户端的连接,因此当用户通过同一个客户端再次发出请求时,服务器不能判断该请求是否来自同一个客户端。在某些情况下,Web服务器为了能够给用户提供更好的服务,必须能够跟踪客户的状态信息。为了解决这一问题,Netscape公司推出了Cookie这一状态管理机制[1]。
在Web应用中,Cookie是HTTP协议制定的一种会话跟踪技术,是一种被广泛采用的记录客户端用户信息的技术。当用户通过客户端浏览器第一次访问Web服务器时,Web服务器会在响应头中增加Set-Cookie头字段,把信息以Cookie的形式发送给客户端浏览器,这些信息可以是用户ID、访问时间、访问记录等。当客户端浏览器再次访问Web服务器时,会把保存的Cookie再发送给服务器,以便服务器对浏览器做出相应的响应[2]。通过Cookie技术可以将用户信息保存在客户端,从而减轻服务器的负担[3]。
Set-Cookie响应头字段以键值对的形式设置Cookie,一个Cookie只保存一个键值对[4]。如图1所示,在图中,服务器向客户端保存了两个Cookie,name和age表示Cookie的名称;zhangsan和30分别是其值;Expires是Cookie的过期时间。如果没有设置Cookie的过期时间,在浏览器关闭的时候,该Cookie的生命就结束了。Cookie必须以键值对的形式存在,一个Cookie可以设置多个属性,不同属性之间必须以分号和空格分隔。
图1 HTTP响应头
客户端浏览器收到服务器发送的Cookie信息,会将该信息保存在浏览器的缓冲区中,当浏览器以后再次访问服务器时,会把该服务器保存的Cookie以HTTP请求头的形式发送给Web服务器[5],见图2。
图2 HTTP请求头
在Servlet API中定义了一个类,名称为Cookie,位于javax.servlet.http包中。利用Cookie类可以创建Cookie、获取Cookie属性信息。Cookie类的构造方法和常用方法如下[2]。
Cookie类的构造方法只有一种形式,其语法格式为:public Cookie(String name,String value)。该方法中,参数name表示Cookie的名称,value表示Cookie的值。Cookie被创建后,它的名称不能再更改,其值可以为任何值,创建后可以被修改。
通过Cookie的构造方法创建Cookie对象后,便可调用该类的方法,其常用方法见表1。
表1 Cookie类常用方法
setMaxAge(int expiry)和getMaxAge()两个方法用于设置和返回Cookie在浏览器上保存的有效时间,以秒为单位。如果设置的expiry值为一个正整数,浏览器会将Cookie信息保存在本地硬盘中,有效时长由expiry的值决定;如果设置的expiry值为负整数,浏览器会将Cookie信息保存在缓存中,当浏览器关闭时,Cookie信息会被删除;如果设置expiry为0,则表示浏览器会马上删除这个Cookie。
setPath(String uri)和getPath()两个方法是针对Cookie的Path属性的。如果创建Cookie对象时没有设置Path属性,其默认值是当前访问路径的父路径。浏览器访问Web服务器时,如果访问路径中包含某个Cookie的路径,就会将该Cookie以HTTP请求头的形式发送给Web服务器。
当用户访问某些Web应用时,经常会显示出上次访问时间。本文通过一个具体的案例来实现显示用户上次访问时间。
(1)创建Web工程,在工程下新建Servlet并命名为LastAccess,伪代码如下:
String lastAccessTime = null;
Cookie[]cookies=获取服务器发送的所有Cookie
for(int i=0;i if(名称为lastAccess的Cookie存在){ lastAccessTime = 获取名称为lastAccess的Cookie的值 break; } } if(lastAccessTime的值为null){ 输出"您是第一次访问本站!" }else{ 输出"您上次访问时间是:lastAccessTime" } //创建Cookie,将当前时间作为Cookie的值发送给客户端 String currentTime = 获取当前时间 Cookie cookie = new Cookie("lastAccess",currentTime); //设置cookie的有效时间为24小时,并发送到客户端 cookie.setMaxAge(60*60*24); response.addCookie(cookie); } (2)启动服务器,在浏览器输入访问地址,由于是第一次访问,会在浏览器中看到“您是第1次访问本站”,见图3。 图3 第1次访问 (3)重新访问该地址,会发现服务器获取到了用户上次的访问时间,见图4。 图4 再次访问结果 图4之所以显示了用户的上次访问时间,是因为第一次访问时,LastAccess向浏览器发送了保存用户访问时间的Cookie信息。当再次通过浏览器访问时,只要Cookie设置的有效时间没有结束,用户就可以看到上次的访问时间。 本文介绍了基于Cookie的会话跟踪及其应用。主要介绍了Cookie的概念,Cookie类常用的方法,最后通过一个实例,实现了通过Cookie技术,获取用户上次访问Web资源的时间。通过实验证明,达到了预期的效果。当然,本方法还有进一步完善的地方,如在跟踪用户状态的同时,要考虑Cookie的安全问题、用户隐私的保护等,在以后的研究中要进一步完善。5 结语