Cookie是客户访问Web服务器时,服务器在客户硬盘上存放的信息,好像是服务器送给客户的“点心”。Cookie实际上是一小段文本信息,客户以后访问同一个Web服务器时浏览器会把它们原样发给服务器。
Cookie API
向客户端发送Cookie
要把Cookie发送到客户端,Servlet先要使用Cookie类的构造方法创建一个Cookie对象,通过setXxx()设置各种属性,通过响应对象的addCookie(cookie)把Cookie加入响应头。具体步骤如下:
(1)创建一个Cookie对象,调用Cookie类的构造方法可以创建Cookie对象。下面语句创建了一个Cookie对象:
Cookie userCookie = new Cookie("username","hacker");
(2)设置Cookie的最大存活时间。最默认情况下,发送到客户端的Cookie对象只是一个会话级别的Cookie,它存储在浏览器的内存中,用户关闭浏览器后Cookie对象将被删除。如果希望浏览器将Cookie对象存储在磁盘中,需要使用Cookie类的setMaxAge()设置Cookie的最大存活时间。下面的设置时间为一周:
userCookie.setMaxAge(60*60*24*7);
(3)向客户发送Cookie对象。要将Cookie对象发送到客户端,需要调用响应对象的addCookie()将Cookie添加到Set-Cookie响应头,如下代码所示:
response.addCookie(userCookie);
下面的Servlet向客户发送一个Cookie对象。
package com.demo;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
@WebServlet("/SendCookie")
public class SendCookieServlet extends HttpServlet{
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException,ServletException{
Cookie userCookie = new Cookie("username", "hacker");
userCookie.setMaxAge(60*60*24*7);
response.addCookie(userCookie);
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html><title>发送Cookie</title>");
out.println("<body><h3>已向浏览器发送一个Cookie。</h3></body>");
out.println("</html>");
}
}
访问该Servlet,服务器将在浏览器上写一个Cookie文件,该文件是一个文本文件。在Windows7中,保存在C:\Users\用户名\AppDate\Local\Microsoft\Windows\Temporary Internet Files文件夹中。
从客户端读取Cookie
要从客户端读入Cookie,servlet应该调用请求对象的getCookies(),该方法返回一个Cookie对象的数组。在大多是情况下,只需要用循环访问该数组的各个元素寻找指定名字的Cookie,然后对该Cookie调用getValue()取得与指定名字关联的值。具体步骤如下:
1)调用请求对象的getCookie方法
该方法返回一个Cookie对象的数组。如果请求中不含Cookie,返回null值。
Cookie[] cookies = request.getCCookies();
2)对Cookie数组循环
有了Cookie对象数组后,就可以通过循环访问它的每一个元素,然后调用每一个Cookie的getName(),直到找到一个与希望的名称相同的对象为止。找到所需要的Cookie对象后,一般要调用它的getValue(),并根据得到的值做进一步处理。
package com.demo;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
@WebServlet("/ReadCookie")
public class ReadCookieServlet extends HttpServlet{
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException,ServletException{
String cookieName = "username";
String cookieValue = null;
Cookie[] cookies = request.getCookies();
if (cookies!=null){
for(int i = 0;i<cookies.length;i++){
Cookie cookie = cookies[i];
if(cookie.getName().equals(cookieName))
cookieValue = cookie.getValue();
}
}
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
out.println("<html><title>读取Cookie</title>");
out.println("<body><h3>从浏览器读回一个Cookie</h3>");
out.println("Cookie名:"+cookieName+"<br>");
out.println("Cookie值:"+cookieValue+"<br>");
out.println("</body></html>");
}
}
访问该Servlet将从客户端读回此前写到客户端的Cookie。