Cookie技术

u  常用的API

创建Cookie对象

Cookie(String name, String value)    ->以指定数据创建Cookie对象

设置Cookie对象

void setMaxAge(int expiry)                ->设置Cookie的最大有效时间

void setPath(String uri)                             ->设置Cookie的有效路径

void setDomain(String pattern)            ->设置Cookie的有效域

发送Cookie对象

void addCookie(Cookie cookie)           ->发送Cookie对象

获取Cookie对象

Cookie[] getCookies()                         ->获取用户请求中的Cookie数组

获取Cookie中携带信息

int getMaxAge()                                ->获取Cookie的最大有效时间

String getName()                               ->获取Cookie的名字

String getValue()                               ->获取Cookie存储的值

String getDomain()                            ->获取Cookie的有效域

String getPath()                                 ->获取Cookie的有效路径

  读和写多个Cookie

如果给客户端输出多个Cookie对象,那么服务器会创建多个

Set-Cookie: name=jack; Expires=Wed, 16-Jan-2013 07:02:01 GMT

Set-Cookie: password=root; Expires=Wed, 16-Jan-2013 07:02:01 GMT头字段进行Cookie的发送。

多个Cookie在浏览器缓存中以一个文件的形式进行存储。

浏览器使用一个Cookie: name=jack; password=root带多个Cookie数据。

 Cookie有效路径

以上的代码在第一次写回Cookie后,如果后面继续请求该网站的其他资源,那么还会继续携带Cookie对象直到Cookie过期。但是如果访问不同网站那么不带该Cookie。

cookie2.setPath("/day08/read");

Set-Cookie: password=root; Expires=Wed, 16-Jan-2013 07:25:06 GMT; Path=/day08/read

存储的时候由于两个Cookie的有效路径不同,因此存储在不同的Cookie文件中。

但是指定有效路径的Cookie文件中多了有效路径的值。

password

root

localhost/day08/read

但是如果现在需要在不同的网站中传递Cookie对象,那么如何指定有效路径。

cookie2.setPath("/");   à 指定Cookie的有效路径是tomcat的webapps目录

  Cookie的跨域

假定A服务器上发布一个网站叫CMS系统,域名www.sina.com.cn

在CMS系统中可以直接编写一个写Cookie的Servlet。但是要设置该Cookie的有效域。

cookie.setDomain(“.163.com”);

假定B服务器上发布一个网站叫IT系统,域名www.163.com

编写一个获取Cookie数据的Servlet进行Cookie的数据读取。

总结:

  1. 可以实现自动登录。用户名和密码默认是明码的。开发者需要自定义加密。Md5 Base64
  2. 购物车的商品ID信息
  3. 存储用户上次的登录时间

使用Cookie实现显示用户的上次访问时间

 1 public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
 2          // 页面输出
 3          response.setCharacterEncoding("utf-8");
 4          response.setContentType("text/html;charset=utf-8");
 5          request.setCharacterEncoding("utf-8");
 6          // 获取字符输出流对象
 7          PrintWriter out = response.getWriter();
 8          // 获取Cookie数组对象
 9          Cookie [] cookies = request.getCookies();
10          // 定义一个时间的字符串变量
11          String date = null;
12          // 定义一个变量存储系统当前日期
13          Date current_date = new Date();
14          SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
15          // 判断是否是第一次登陆
16          if(cookies != null){
17              // 直接循环
18              for(Cookie cookie : cookies){
19                  // 获取Cookie
20                  if("lasttime".equals(cookie.getName())){
21                      // 获取上次访问的时间
22                      date = cookie.getValue(); 
23                      break;
24                  }else{
25                      // 获取系统时间
26                      date = format.format(current_date);
27                  }
28              }
29          }else{
30              // 获取系统时间
31              date = format.format(current_date);
32          }
33          // 显示时间
34          out.println(date);
35          // 将这次访问的时间写入Cookie
36          Cookie new_cookie = new Cookie("lasttime",
37 format.format(new Date())); 
38          new_cookie.setMaxAge(5*60);
39          new_cookie.setPath("/day08/showtime");
40          // 发送
41          response.addCookie(new_cookie);
42     }

 如果cookie没有调用setMaxAge方法,这个cookie没被放在文件里,而是放在客户端浏览器的内存中。

Cookie细节

  1. 一个Cookie只能存储一种信息。
  2. 一个网站可以发送多个Cookie,浏览器可以同时携带多个Cookie。
  3. 同一个网站最多发送20个Cookie,浏览器最多存储300个Cookie,一个Cookie最多存储数据在4K以内。
  4. 如果创建了Cookie对象没有指定最大有效时间那么不会存储在浏览器的缓存中。
posted on 2014-05-16 14:51  wf110  阅读(276)  评论(0编辑  收藏  举报