介绍
1、 Cookie 指 web 服务器保存在客户端的一系列文本信息,它们用于各种信息的跟踪,通常设置在HTTP标头中。
2、 Cookie 来自于 Servlet 规范中一个工具类,存在于 Tomcat 提供的 servlet-api.jar 中。
3、如果两个 Servlet 来自于同一个网站,并且为同一个浏览器/用户提供服务,此时借助于 Cookie 对象进行数据共享。
4、 Cookie 存放当前用户的私人数据,在共享数据过程中提高服务质量。
5、在现实生活场景中, Cookie 相当于用户在服务端得到“会员卡”。
原理
1、用户通过浏览器第一次向 MyWeb 网站发送请求申请 OneServlet。
2、OneServlet在运行期间创建一个 Cookie 存储与当前用户相关的数据,OneServlet工作完毕后,将 Cookie 写入到响应头交还给当前浏览器。
3、浏览器收到响应包,将Cookie存储在浏览器的缓存一段时间。
4、用户通过同一个浏览器再次向 MyWeb 网站发送请求申请TwoServlet时,浏览器需要无条件的将 MyWeb 网站之前推送过来的 Cookie 写入到请求头发送过去。
5、 TwoServlet 在运行时,就可以通过读取请求头中 Cookie 中的信息,得到OneServlet提供的共享数据。
用途
比如:判断注册用户是否已经登录网站、网购购物车的处理等。所以消耗的是客户端的存储空间, Cookie 给网站和用户带来的好处非常多。
1、 Cookie 能使站点跟踪特定访问者的访问次数、最后访问时间和访向者进人站点的路径。
2、 Cookie 能告诉在线广告商广告被点击的次数,从而可以更精确地投放广告。
3、简化用户登录,Cookie 有效期限未到时,Cookie 能使用户在不键入密码和用户名的情况下进人曾经浏览过的一些站点。
4、 Cookie 能帮助站点统计用户个人资料以实现各种各样的个性化服务。
(不足的是安全风险:容易泄露用户信息)
实现命令
1、创建 Cookie 对象
Cookie cookie = new Cookie(String name, String value);
2、将 Cookie 写入到响应头
response.addCookie(cookie);
3、
注意:
1、 cookie 相当于一个 map 集合。
2、一个 cookie 只能存放一个键值对。
3、键值对的 name 和 value 只能是 String 。
4、键值对中的 name 不能是中文。
Cookie 生命周期
概述
1、默认情况下, Cookie 只在浏览器的内存中存活,也就是说,当关闭浏览器后, Cookie 就会消失。
2、可以使用Cookie setMaxAge(int expiry)
来设置 Cookie 的存活时间。参数 expiry 表示 Cookie 存活的秒数。
示例
1、cookie.setMaxAge(60*60)
:表示 cookie 对象可存活1小时。就算关闭浏览器,就算重启客户端电脑, cookie 也会存活1小时。因为当 maxAge 大于0时,浏览器不仅会把 cookie 保存在浏览器内存中,还会把 cookie 保存到硬盘上。
2、cookie.setMaxAge(-1)
: cookie 的 maxAge 属性的默认值就是-1(其实只要是负数都是一个意思),表示只在浏览器内存中存活。一旦关闭浏览器窗口,那么 cookie 就会消失。
3、cookie.setMaxAge(0)
: cookie 被作废。表示 cookie 即不在内存中存活,也不在硬盘上存活,这样的 cookie 设置只有一个目的,那就是覆盖客户端原来的这个 cookie ,使其作废。
//设置 cookie 的存活时间,里面的参数是以秒为单位
cookie.setMaxAge(60*60);
//如果 maxAge 设置成-1代表是当前 cookie 的销毁时间是浏览器关闭,和默认是一样的
cookie.setMaxAge(-1);
//如果 maxAge 设置成0代表删除已经存在的和当前同名的 cookie
cookie.setMaxAge(0);
4、设置 cookie 的声明周期的语法格式如下:
Response.Cookies["Cookie的名称"].Expires="日期";
Response.Cookies["UserName"].Value = “Chinajiyong“;
Response.Cookies["UserName"].Expires = DateTime.MinValue;//表示关闭浏览器 UserName 过期
5、对于 HttpCookie 对象存储 Cookie 的时间设定如下:
HttpCookie cookie = new HttpCookie("UserName");
cookie.Expires = DateTime.MinValue;//表示关闭浏览器UserName过期
Response.Cookies.Add(cookie);
代码示例
同一个网站 Oneservlet 与 Twoservlet 借助于 Cookie 实现数据共享。
- OneServlet(doGet):
/*
为防止取出 cookie 时出现:
name:JSESSIONID value:F02268D52270042A810DF055361B7523
在添加 cookie 的 servlet 里面加上下面的代码
*/
request.setCharacterEncoding("utf-8");
//1、创建一个 cookie 对象,保存共享数据(当前用户数据)
Cookie card = new Cookie("zhangsan","123");
Cookie card2 = new Cookie("lisi","567");
//2、将 cookie 写入到响应头,交给浏览器。
response.addCookie(card);
response.addCookie(card2);
- TwoServlet(doGet):
//1、调用请求对象从请求头得到浏览器返回的 Cookie
Cookie[] cookies = request.getCookies();
//2、循环遍历数据得到每一个 Cookie 的 name 与 value
for (Cookie admins:
cookies) {
//读取 name
String name = admins.getName();
//读取 value
String value = admins.getValue();
//输出
System.out.println("name:" + name + " "
+ "value:" + value);
}
先访问 /one ,创建 Cookie 存储与当前用户相关的数据。
访问 /two ,获取缓存在浏览器的数据。
之后想再次获取数据时,直接访问 /two