A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 八戒 中级黑马   /  2015-6-8 11:53  /  356 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

这些是cookie的一些学习笔记,希望能和大家分享分享..............
Cookie
1. 什么是Cookie
* Cookie是HTTP协议的规范之一,它是服务器和客户端之间传输的小数据。
* 首先由服务器通过响应头把Cookie传输给客户端,客户端会将Cookie保存起来。
* 当客户端再次请求同一服务器时,客户端会在请求头中添加该服务器保存的Cookie,发送给服务器。
* Cookie就是服务器保存在客户端的数据!
* Cookie就是一个键值对!!!
2. Cookie规范
* Cookie通过请求头和响应头在服务器与客户端之间传输;
* Cookie大小限制在4KB之内;
* 一台服务器在一个客户端最多保存20个Cookie;
* 一个浏览器最多可以保存300个Cookie;
虽然Cookie规范是如此,但在今天,浏览器厂商的竞争异常激烈,所以多少会超出Cookie规则的限制。但也不会超出过多!
3. Cookie与请求头和响应头
* 服务器向客户端发送Cookie的响应头为Set-Cookie,例如:Set-Cookie:cookiename=cookievalue
* 客户端向服务器发送Cookie的请求头为Cookie,例如:Cookie:cookiename=cookievalue
4. Servlet中向客户端发送Cookie
Cookie cookie1 = new Cookie("test1", "abcdefg");
Cookie cookie2 = new Cookie("test2", "ABCDEFG");
response.addCookie(cookie1);
response.addCookie(cookie2);
5. Servlet中获取客户端发送过来的Cookie
Cookie[] cs = request.getCookies();
if(cs != null) {
    for(Cookie c : cs) {
      System.out.println(c.getName() + "=" + c.getValue());
    }
}
=============================
Cookie的细节

1. Cookie的maxAge
  当服务器创建Cookie对象后,可以调用setMaxAge()方法设置Cookie的最大生命。
  * maxAge > 0:表示Cookie在客户端硬盘上保存的最大时间,单位为秒;
  * maxAge < 0:表示Cookie不会被浏览器保存到硬盘上,而只在浏览器内存中存活,一旦客户端关闭浏览器在,那么Cookie就消失;
  * maxAge == 0:表示删除Cookie,例如客户端硬盘已经存在名为abc的Cookie,如果服务器再向客户端发送名为abc,并且maxAge为0的Cookie,那么表示删除客户端上的名为abc的Cookie。

2. Cookie的path
  浏览器在访问BServlet时,是否要带上AServlet保存的Cookie呢?这要看Cookie的path了。
  现有资源如下:
  * http://localhost:8080/day06_2/servlet/AServlet
  * http://localhost:8080/day06_2/servlet/BServlet,保存名为xxx的Cookie
  * http://loclahost:8080/day06_2/servlet/CServlet,保存名为yyy的Cookie
  * http://loclahost:8080/day06_2/servlet/user/DServlet, 保存名为zzz的Cookie

  // 没有设置Cookie的path
  AServlet {
     Cookie c = new Cookie("xxx", "XXX");
     response.addCookie(c);
  }
  // 设置了Cookie的path为/day06_2
  CServlet {
     Cookie c = new Cookie("yyy", "YYY");
     c.setPath="/day06_2";
    response.addCookie(c);
  }
  DServlet {
    Cookie c = new Cookie("zzz", "ZZZ");
    resposne.addCookie(c);
  }
  在BServlet中保存的Cookie没有设置path,那么它的path默认为当前BServlet的所在路径,即“/day06_2/servlet”。
  在CServlet中保存的Cookie设置了path为/day06_2。
  在DServlet中保存的Cookie没有设置path,那么它的path默认为DServlet的所在路径,即“day06_2/servlet/user”


  当访问AServlet时,是否要带上xxx这个Cookie呢?因为AServlet的访问路径为/day06_2/servlet/BServlet,它包含了xxx的path,即/day06_2/servlet,所以需要带上。

  当访问AServlet时,是否要带上yyy这个Cookie呢?因为AServlet的访问路径为/day06_2/servlet/BServlet,它包含了xxx的path,即/day06_2,所以需要带上。

  当访问AServlet时,是否要带上zzz这个Cookie呢?因为AServlet的访问路径为/day06_2/servlet/BServlet,它不包含zzz的path,即/day06_2/servlet/user,所以不会带上。

  
3. Cookie的domain
  Cookie的path是在同一主机中指定共享Cookie,如果主机不同那么就一定不能共享Cookie,无论path是什么。
  如果希望不同的二级域名中可以共享Cookie,那么就要设置Cookie的domain了。
  例如:news.baidu.com、tieba.baidu.com、zhidao.baidu.com,它们的域名不同,但百度希望它们之间可以共享Cookie,那么就要设置domain了。

  1). 设置Cookie的path为“/”,例如:cookie.setPath("/");
  2). 设置Cookie的domain,例如:cookie.setDomain(".baidu.com"),其中domain中没有指定域名前缀!

  在news.baidu.com主机中的某个项目中保存了Cookie
  在tieba.baidu.com主机中某个项目中获取Cookie

  当然这需要配置两个虚拟主机才行。
  

4. Cookie保存中文
  Cookie的name和value都是不能保存中文的,但可以先把中文转换成URL编码,然后在保存到Cookie的name和value中。
  String name = "姓名";
  String value = "张三";
  name = URLEncoder.encode(name, "utf-8");
  value = URLEncoder.encode(value, "utf-8");

  Cookie c = new Cookie(name, value);
  response.addCookie(c);

  在获取Cookie时,再使用URL解码即可。
  Cookie[] cs = request.getCookies();
  if(cs != null) {
    for(Cookie c : cs) {
      String name = URLDecoder.decode(c.getName(), "utf-8");
      String value = URLDecoder.decode(c.getValue(), "utf-8");
      System.out.println(name + "=" + value);
    }
  }

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马