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。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐