本篇供个人学习使用,有问题欢迎讨论
Cookie
一、Cookie引入
当用户在未登录状态下在 “ 京东 ’ 购物网站向购物车中添加某些商品后,将浏览器关闭。然后再打开浏览器访问 “ 京东 ”,此时查看购物车会发现,购物车中仍然具有刚才添加的商品。那么这些商品信息是保存在哪里的呢?
当在登录126邮箱时选上 “ 十天内免登录 ” ,再登录时的确是不需要输入用户名与密码了,那么是网站不需要对用户进行验证了?当然不是。那么,网站用于用户验证的用户名与密码是从哪里获取到的?
这两个例子都有一个共同点:换台机器就不再是前面所述情况了。即换台电脑打开 “ 京东 ” 购物网站,购物车中就没有原来选好的商品了。换台电脑打开126网站,仍然需要输入用户名与密码。那就说明一个问题:那些信息是保存在客户端电脑里的,并没有保存在服务器中。将原来的电脑重启后,再次访问这些网站,发现购物车中仍有原来的商品, 126 网站仍然不需要输入用户名与密码。那就说明一个问题:那些信息是保存在客户端电脑的硬盘中的,而不是内存中。
客户端电脑中用于保存这些会话状态的资源,称为cookie。
二、 Cookie简介
Cookie 是1993年由网景公司(Netscape)前雇员发明的一种进行网络会话状态跟踪的技术。
会话则是由一组请求与响应组成,是围绕着一件相关事情所进行的请求与响应。所以这些请求与响应之间一定是需要有数据传递的,即是需要进行会话状态跟踪的。然而HTTP协议是一种无状态协议,在不同的请求间是无法进行数据传递的。此时就需要一种可以进行请求间数据传递的会话跟踪技术,而 Cookie 就是一种这样的技术。
Cookie 是由服务器生成,保存在客户端的一种信息载体。这个载体中存放着用户访问该站点的会话状态信息。只要 Cookie 没有被清空,或者 Cookie 没有失效,那么,保存在其中的会话状态就有效。
用户在提交第一次请求后,由服务器生成 Cookie,并将其封装到响应头中,以响应的形式发送给客户端。客户端接收到这个响应后,将 Cookie 保存到客户端。当客户端再次发送同类请求后,在请求中会携带保存在客户端的 Cookie 数据,发送到服务端,由服务器对会话进行跟踪。
Cookie 技术并不是 JavaWeb 开发专属技术,而是属于Web开发的技术,是所有 Web 开发语言均支持的技术。
Cookie 是由若干键值对构成,这里的键一般称为 name,值称为 value。 Cookie 中的键值对均为字符串。
三、谷歌下查看 Cookie
不同的浏览器,其 Cookie 的保存位置及查看方式是不同的。删除了某一浏览器下的Cookie,不会影响到其它浏览器中的Cookie。
在谷歌浏览器下可以直接查看到 Cookie 的信息。查看位置在:
四、Cookie的使用
1、Cookie 的使用
(1)如何创建一个 cookie 对象,来保存共享数据
Cookie cookie = new Cookie("key",共享数据名);
注意:一个 cookie 对象只能有一个键值对;cookie 对象只能存储 String 类型共享数据
(2)如何将Cookie写入到响应包的【响应头】
response.addCookie(cookie)
(3)如何从请求协议包的【请求头】读取浏览器返还的 cookie
Cookie array[] = request.getCookies();
2、设置绑定路径
cookie.setPath("/aaa/bbb/ccc");
3、cookie 对象的生命周期
(1)默认情况:cookie 是保存在浏览器的内存中。所以在浏览器关闭时,cookie 会被 windows 进行销毁。
(2)人工干预:要求将 Cookie 保存到客户端计算机的【硬盘上】,同时制定 cookie 在硬盘上存活
时间。在存活时间范围之内,关闭浏览器甚至关闭计算机,都不会导致 cookie 被销毁。
cookie1.setMaxAge(60 * 60); //设置cookie的有效期为1小时
cookie2.setMaxAge(60 * 60 * 24 * 10); //设置cookie的有效期为10天
注意:设置Cookie的有效期。这个值为一个整型值,单位为秒
该值大于0,表示将Cookie存放到客户端的硬盘
该值小于0,与不设置效果相同,会将Cookie存放到浏览器的缓存
该值等于0,表示Cookie一生成,马上失效
4、cookie 缺点
(1)一个 cookie 对象只能存放一个键值对,如果存储的数据较多, 需要管理多个 Cookie
(2)cookie 只能存放 String 类型数据,无法存放【高级类型Java数据,比如List、Map】
五、 Cookie的禁用
一旦禁用,有些浏览器可能会禁止客户端的访问!
六、免密登录的实现
1、页面部分
<form action="/myWeb/one.do" method="get">
用户名:<input type="text" name="username" value="${cookie.username.value }" /><br>
密码:<input type="password" name="password" value="${cookie.password.value }" /><br>
<input type="submit" value="登录">
</form>
2、对 Servlet 进行编辑
(1)接收用户提交的请求
response.setContentType("text/html;charset=UTF-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
PrintWriter out = response.getWriter();
(2)把用户的信息存储到 Cookie 中
if ("admin".equals(username) && "123".equals(password)){
Cookie cookie1 = new Cookie("username",username); //创建cookie对象
Cookie cookie2 = new Cookie("password",password);
cookie1.setMaxAge(60 * 10); //设置Cookie的时间为10分钟
cookie2.setMaxAge(60 * 10);
response.addCookie(cookie1); //将Cookie写入到响应包的【响应头】中
response.addCookie(cookie2);
out.println("欢迎回来," + username + "主人");
} else {
out.println("您的验证不合格,请重新输入!");
}
3、测试
(1)输入错误用户名或密码
(2)输入正确的用户名和密码,跳转到 OneServlet
上图表示用户名和密码已经存储到客户端上了,时间为10分钟
(3)关闭浏览器,重新进入页面时会发现页面上已经显示出用户名和密码了
七、VIP通道
1、初始化页面
<center>
<h1>新用户点餐页面</h1>
<form action="/myWeb/one.do">
客户:<input type="text" name="username" /><br>
饺子类型:<input type="radio" value="三鲜饺子" name="jiaozi">三鲜饺子
<input type="radio" value="虾仁饺子" name="jiaozi">虾仁饺子
<input type="radio" value="猪肉饺子" name="jiaozi">猪肉饺子<br>
<input type="submit" value="点餐" />
</form>
<h1>VIP通道</h1>
<a href="/myWeb/two.do">贵客里面请</a>
</center>
2、对接受点餐的数据进行设置OneServlet
(1)读取当前用户基本信息
String name = request.getParameter("username");
String jiaozi = request.getParameter("jiaozi");
(2)将当前用户的私人数据保存到 Cookie 中
Cookie cookie1 = new Cookie("key1",name);
Cookie cookie2 = new Cookie("key2",jiaozi);
(3)将 Cookie 对象写入到【响应包】中的【响应头】
response.addCookie(cookie1);
response.addCookie(cookie2);
读取Cookie:
3、当顾客再次点餐时,直接从VIP通道进入TwoServlet
(1)读取当前来访的浏览器推送回来的 Cookie
Cookie array[] = request.getCookies();
(2)根据得到的 Cookie,来招待当前用户
for (Cookie cookie:array){
String name = cookie.getName(); //读取Cookie中关键字名称
String value = cookie.getValue(); //读取Cookie中共享数据
if ("key1".equals(name)){
System.out.println(value + "客人,想死我啦!");
} else if ("key2".equals(name)){
System.out.println("我们早就将" + value + "准备好了");
}
}
在控制台中查看数据: