前面5.6和6.5节曾介绍过读写cookie的方法,本章所要介绍的是cookie的具体使用方法。cookie俗称小甜饼,可以在客户端长期保存信息。它是服务器端发送到客户端浏览器的文本串句柄,保存在客户的硬盘上。当你第一次访问一个网站时,它会将有关信息保存在你计算机硬盘上的cookie里,下一次再次访问该网站时,它就会读取你计算机上的cookie,并将新的信息保存在你的计算机上。cookie有两种形式:会话cookie和永久cookie。前者是临时性的,只有浏览器打开时存在;后者则永久地存在于用户的硬盘上并在指定日期过期之前一直可用。
如果要读写cookies则必须首先建立DCookie对象,虽然DCookie不是内置对象,不过读写cookies都必须通过此类,其实一个DCookie的类即代表了一个cookie,所有的cookie信息都会在DCookie中,而且可以通过DCookie方法修改这些信息。
构造函数:public DCookie(String iname, String ivalue)
创建一个DCookie对象,本对象就代表一个cookie。
参数:iname表示cookie的名字。
ivalue表示cookie的值。
异常:如果iname设置为Comment、Discard、Domain、Expires、Max-Age、Path、Secure、Version以及以$开头则抛出参数异常,因为这些是cookie协议保留的关键字。
方法:
1. public String getName()
获取DCookie对象的名字。
返回:DCookie对象的名字。
2. public String getValue()
获取DCookie对象的值。
返回:DCookie对象的值。
3. public void setValue(String newValue)
设置DCookie对象的值,此值虽然可以在构造函数中设置,而本方法主要用于改变当前DCookie对象的值。
参数:newValue表示DCookie对象需要新设的值。
4. public int getVersion()
获取DCookie对象的cookie版本。
返回:DCookie对象的cookie版本。
注意:cookie的格式有2个不同的版本,第一个版本,我们称为Cookie Version 0,是最初由Netscape公司制定的,几乎所有的浏览器都支持。而较新的版本,Cookie Version 1,则是根据RFC 2109文档制定的。 |
5. public void setVersion(int v)
设置DCookie对象的cookie版本。如果不设置则默认为0版本。
参数:v表示DCookie对象需要设的cookie版本,目前合法的版本为0或1。
6. public void setComment(String purpose)
设置DCookie对象的cookie注释信息。
参数:purpose表示DCookie对象需要设的cookie注释信息。
7. public String getComment()
获取DCookie对象的cookie注释信息。
返回:DCookie对象的cookie注释信息。
8. public void setDomain(String pattern)
设置DCookie对象的cookie适用的域。一般地,cookie只返回给与发送它的服务器名字完全相同的服务器。使用这里的方法可以指示浏览器把cookie返回给同一域内的其他服务器。注意域必须以点开始(例如.sitename.com),非国家类的域(如.com,.edu,.gov)必须包含两个点,国家类的域(如.com.cn,.edu.uk)必须包含三个点。
参数:pattern表示DCookie对象需要设置的cookie适用的域。
9. public String getDomain()
获取DCookie对象的cookie适用的域。
返回:DCookie对象的cookie适用的域。
10. public void setMaxAge(int expiry)
设置DCookie对象cookie的有效期,单位为秒。cookie都有一个有效期,如果有效期的值为负数,则表示无需长久保存该cookie即会话cookie,当该浏览器退出时,该cookie就失效了即会话cookie。如果不设置则默认为-1。如果设置为0,则表示cookie立即过期即删除当前cookie.
参数:expiry表示DCookie对象需要设置的cookie的有效期。
11. public int getMaxAge()
获取DCookie对象的cookie的有效期。
返回:DCookie对象的cookie的有效期,如果在未设置此值的情况下则返回默认值-1。
12. public void setPath(String uri)
设置DCookie对象的cookie有效路径,此路径用于指定服务器上可以使用该cookie的文件所在的路径,它只对该网址下的该路径下的应用起作用。“/”表示服务器上所有目录都可以使用该cookie。如果不设置则默认为“/”。
参数:pattern表示DCookie对象需要设置的cookie有效域路径。
13. public String getPath()
获取DCookie对象的cookie有效路径。
返回:DCookie对象的cookie有效路径。
14. public void setSecure(boolean flag)
设置DCookie对象的cookie的安全性,此值设置一个boolean值。如果不设此值,则默认是关闭安全性。
参数:flag表示DCookie对象cookie的安全性,如果设置为true则表示此cookie是安全的即只能通过加密的连接(即SSL)发送,否则表示此cookie是关闭安全性即能在普通的连接中发送。
15. public boolean getSecure()
获取DCookie对象的cookie安全性。
返回:DCookie对象的cookie安全性,如果是安全模式则返回true,否则返回false。
注意:此类不是同步的。如果多个线程同时访问一个 DCookie对象,必须保持外部同步,这样修改和读取属性以及输出cookie才能确保一致。 |
如果要读写cookies则必须首先建立DCookie对象,正如前面所介绍的,一个DCookie对象就代表一个cookie。
如果要读写cookie则需要用到前面介绍过的request和response的方法,举个例子writecookie.dqm是向客户端写入cookie的,其源代码如下:
1 2 3 4 5 6 7 |
<%@ page buffer="true"%> <% DCookie ck=new DCookie("username", "dunne"); ck.setMaxAge(30*60); // 设置Cookie的存活时间为30分钟 response.addCookie(ck); // 写入客户端硬盘 out.print("写Cookie完成"); %> |
从上面程序可以看到如果要将cookie写入需要用到response对象的addCookie方法(参见5.6节)。第1行为开启缓存,因为写入cookie的方法必须开启缓存。第3行为新建一个cookie且设置了名字和值。
接下来看如何读取cookie,readcookie.dqm用于读取当前请求的客户端中所有的cookie,并将这些cookie的名字和值显示出来,源程序如下:
1 2
3 4 5 6 7 8 9 10 11 12 13 14 15 |
<% DCookie cookies[]=request.getCookies(); // 将适用目录下所有Cookie读入cookies数组中
if(cookies.length == 0) {// 如果没有任何cookie out.print("no any cookie"); } else { out.print(cookies.length + "<br>"); for(int i = 0; i < cookies.length; i++) // 循环列出所有可用的Cookie { out.println(cookies[i].getName() + "->" + cookies[i].getValue() + "<br>"); } } %> |
执行结果为:
2 DQMSESSIONID->fe7a9b1a-0b24-4a47-8bae-9e377ef16141 username->dunne |
上面执行结果可以看到总共找到了2个cookie,我们明明只设置了一个cookie为什么会读到二个呢?其实另一个名为DQMSESSIONID的cookie是session机制生成的(关于session第8章会介绍到),所以我们在写入cookie时不要使用DQMSESSIONID这个名字。
如果知道cookie的名字,则可以直接读取,directreadcookie.dqm用于直接读取当前请求的客户端中的cookie,并将cookie的值显示出来,源程序如下:
1 2 3 4 5 |
<% String value =request.getCookieValue("username");
out.println("cookie的值为:" + value); %> |
执行结果为:
cookie的值为:dunne |