大可制作:QQ群:31564239(asp|jsp|php|mysql)

JSP/Servlet: Cookie

HTTP协议(Protocol)本身是一种无状态协议,浏览器用HTTP向服务器请求一个文件,服务器就将要求的文件传回,然后连线中断,当浏览器发出 另一个请求时,它与上一个请求并无关联,服务器不会知道任何有关上一次请求的任何信息,这对于静态网页来说是很自然的处理方式且并不会有问题,然而对于 Web应用程序来说就是一个难题,如果页面之间没有关系,则上一个页面所挑选的商品,在下一个页面中并不会被得知。

即然HTTP本身是无状态协议,为了要在下一次请求中,让服务器能处理上一次请求中的一些信息,最自然的方法,就是将上一次请求结果中的一些信息,在下一次请求时一并传送给服务器,基于这种方式,传统上通常会有三种作法:隐藏表单栏位信息、URL rewriting或是使用Cookie

隐藏表单栏位基本方式很简单,就是将下次所需要的讯息发回给客户端,在客户端设置一个表单并包括隐藏栏位,这样客户端下次发送讯息时,会一并发送隐藏栏位 中的数据,如此就可以维护状态方面的讯息,这个方法的缺点是状态讯息不断的在客户端与伺服端之间来回,较耗费网路频宽,并且客户端可以藉由检视网页原始码 来发现讯息,保密性上有相当的顾虑。

URL rewriting的例子在 session(2) 中有提到一些,您可以直接引用该篇主题的内容。

Cookie是储存客户端讯息的一种方式,它储存在客户端电脑上,您可以设定给它一个存活期限,保留一些有用的讯息在客户端,即使是在客户端关闭浏览器之 后,再次连接服务器时若Cookie仍在有效期限中,就可以再利用Cookie中储存的讯息,一个常见的应用就是设定表单的自动登入讯息。

cookie是JSP中用来操作Cookie的隐含对象,来看一个实际的例子:

  • cookieDemo.jsp
<%@page contentType="text/html;charset=Big5"%>
<html>
<header><title>Cookie</title></header>
<body>

<%
Cookie[] cookies = request.getCookies();
if(cookies == null) {
Cookie userCookie =
new Cookie("user", "caterpillar");
response.addCookie(userCookie);
out.println("<br>已设定cookie,三秒后重新连接!");
response.setHeader("Refresh",
"3; URL=http://localhost:8080/myjsp/cookie.jsp");
}
else {
for(int i = 0; i < cookies.length; i++) {
out.println("<br>Cookie name: " +
cookies[i].getName());
out.println("<br>Cookie value: " +
cookies[i].getValue());
}
}
%>

</body>
</html>

这个JSP网页会试着使用 request 隐含对象的getCookies()方法取得所有可用的Cookie对象,如果没有取得,表示客户端目前没有可用的Cookie,此时您新增 Cookie对象,并指定name-value给它,并使用 response 隐含对象的addCookie()方法,将新建立的Cookie对象加入,之后Cookie对象的讯息会以Cookie的方式发回至客户端并储存。

如果客户端有可用的Cookie,则使用循环一一将其取出,藉此得到客户端中可用的状态或相关讯息,您可以使用getName()方法取得Cookie的 名称,getValue()取得其中的值,如果是上面的JSP网页,则getName()会取得 "user" ,而getValue()会取得 "caterpillar"。

Cookie对象有其生命期限,基本上始于建立Cookie时,而关闭浏览器之后,自动清除Cookie对象,您也可以设定Cookie的生命期限,让它 储存在客户端久一些,这样即使关闭浏览器,Cookie也不会被清除,您可以使用Cookie的setMaxAge()来设定生命期限,设定单位是秒,例 如:
Cookie userCookie =
            new Cookie("user", "caterpillar");
userCookie.setMaxAge(3600);
response.addCookie(userCookie);
 
如果想要直接删除使用中的Cookie,则可以设定setMaxAge()方法的参数为 0,即生命期限为 0,就相当于立即让 Cookie失效。