文章目录
Cookie
1.为什么使用Cookie
1.1会话控制
- 流程控制:控制程序的执行流程。【程序正常从上至下,从左到右第的执行流程。if&for】
- 会话控制:控制浏览器与服务器之间的会话。【与浏览器有关,只要不关闭,不更换浏览器时,即为当前会话】
1.2 Http协议【无状态】
Http是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接,这就意味着服务器无法从连接上跟踪会话。因此可以认为,服务器无法区分不同的用户【浏览器】,此时就需要Cookie【session】来区分不同的用户。
2.Cookie的简介
2.1.Cookie由来:小饼干,【程序员买饼干的故事】
2.2Cookie具体是什么?
Cookie实际上是服务器上保存的浏览器上的一小段信息,目的:区分不同的浏览器【即:用户】。其就是一种【服务器以键值对存储少量信息的方式通知浏览器的】技术。
3.Cookie的工作原理
- 1.浏览器向服务器发送请求【程序员带着小女儿去饼干店买饼干】
- 2.服务器创建Cookie对象(卡片),该Cookie对象会携带用户信息,最终服务器会将Cookie对象发送给浏览器。【饼干店搞活动,饼干店制作卡片,并在卡片上盖章,最终将卡片发送给程序员】
- 3.以后浏览器再次请求服务器时,会携带Cookie对象。【程序员再次来店买饼干时,会携带卡片】
- 4.服务器通过该Cookie对象,区分不同的浏览器(用户)。【饼干店会通过不同的卡片,区分不同的用户】
4.Cookie的基本使用
4.1Cookie的创建
//创建Cookie对象,并将信息保存到Cookie。
Cookie cookie = new Cookie("level","level2");
//将Cookie对象,响应给浏览器
response.addCookie(cookie);
4.2Cookie的获取
//获取Cookie信息
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
System.out.print("cookieName = " + cookie.getName());
System.out.println("cookieValue = " + cookie.getValue());
}
4.3Cookie的修改
//查找指定Cookie对象,进行修改
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
if("level".equals(cookie.getName())){
//将Cookie的value更改为“level3”
cookie.setValue("level3");
//将Cookie对象响应浏览器
response.addCookie(cookie);
break;
}
}
//创建同名Cookie对象,响应给浏览器,实现Cookie覆盖式修改。[推荐使用]
Cookie cookie = new Cookie("level","level4");
//将Cookie对象响应浏览器
response.addCookie(cookie);
4.4Cookie的键值问题
Cookie的语法规定:Cookie的name不能使用中文,Cookie的value可以使用中文,但需要设置底层字符集问题,相对比较繁琐。所以建议使用英文,不推荐使用中文。
//浏览器获取服务器Cookie:解码
URLDecoder.decode(cookie.getValue(),"UTF-8")
//服务器响应浏览器Cookie:编码
URLEncoder.encode("等级4","UTF-8")
5.Cookie有效性&持久化Cookie【重点】
5.1Cookie的有效时间
- 默认情况:Cookie的有效时间为【会话级别】,当前会话有效。【与浏览器一一对应,只要不关闭,不更换浏览器,会话始终有效】
- 持久化Cookie【如持久化Cookie后,默认会话级别失败】
–使用场景:如需要关闭浏览器后,依然需要Cookie有效,此时需要持久化Cookie
–示例代码:cookie.setMaxAge(ss:秒,intl类型);设置Cookie的有效(存活)时间
—ss>0:在ss秒后Cookie失效。(与浏览器无关)
—ss=0:立即失效
—ss<0:回复默认的会话级别 - Cookie默认不能在不同的浏览器之间共享
5.2Cookie有效路径
- 默认情况:Cookie的默认有效路径为:当前项目下有效,如:
http://localhost:8080/day13_cookie_session
- 设置Cookie的有效路径:cookie.setPath()
–一般设置Cookie的有效路径时,都会设置到当前项目下的某个路径。如:
<http://localhost:8080/day13_cookie_session/cookie_demo.jsp>
代码:cookie.setPath(request.getContextPath+"/xxxURL");
6.Cookie的应用
- 需求:当用户登录成功后,且勾选“7天免输入”复选框后,在7天内可以实现“免输入”效果。
- 代码:
<h2>7天免输入功能-login</h2>
<%--unCookie:${cookie.username.value}--%>
<form action="LoginServlet?method=login" method="post">
用户名:<input type="text" name="username" value="${cookie.username.value}"><br>
密码:<input type="password" name="pwd" value="${cookie.pwd.value}"><br>
7天免输入:<input type="checkbox" name="cb"><br>
<input type="submit" value="登录">
</form>
//获取用户名&密码请求参数
String username = request.getParameter("username");
String pwd = request.getParameter("pwd");
String cb = request.getParameter("cb");
if(cb!=null && cb.length()>0){
//勾选“7天...”
//将用户名&密码存放到Cookie中,并持久化7天
Cookie unCookie = new Cookie("username",username);
Cookie pwdCookie = new Cookie("pwd",pwd);
//持久化Cookie7天
unCookie.setMaxAge(60*60*24*7);
pwdCookie.setMaxAge(60*60*24*7);
//响应给浏览器
response.addCookie(unCookie);
response.addCookie(pwdCookie);
}
7.Cookie的缺陷
- 1.Cookie的value是String类型,存储数据时,不方便
- 2.Cookie由服务器创建。【存储在浏览器,相对不安全】
- 3.如Cookie过多时,会浪费流量【数据流量,不同的浏览器厂商,对cookie的数量以及大小有不同的限制,一般在(数量:200-500个,大小:2kb左右)】