状态管理--Cookie
状态管理
1) 什么是状态管理
- 将浏览器与web服务器之间多次交互当作一个整体来看待,并且将多次交互涉及到的数据(即状态)保存下来.
2) 如何进行状态管理?
- 将状态保存在浏览器端(Cookie)
- 将状态保存在服务器端(Session)
3) Cookie
(1)什么是Cookie?
- 服务器临时存在浏览器端的少量数据,用于跟踪用户的状态
(2) Cookie的工作原理
- 当浏览器访问服务器时,服务器会将少量数据以`set-cookie`消息头的方式发送给浏览器,浏览器会将这些数据临时保存下来,当浏览器再次访问服务器时,会将这些数据以`cookie`消息头的方式发送给服务器.
(3) Cookie的添加(服务器将cookie发送给浏览器,response响应对象的方法)
Cookie cookie = new Cookie(String name , String value);//name:value只能存放字符串,名字:值;
response.addCookie(cookie);//将Cookie对象作为参数
(4) Cookie的获取(request请求对象的方法)
Cookie[] cookies = request.getCookies();
//首先进行判断,不为空的时候才可以进行遍历操作,因为可能一个Cookie也没有
String name = cookie.getName();
String value = cookie.getValue();
(5) Cookie的生存时间
- 默认情况下,浏览器会将Cookie保存在内存中,浏览器关闭,则Cookie会被删除.
cookie.setMaxAge(int seconds);
注:
a:单位是s;
b:当seconds>0,浏览器将Cookie保存在硬盘上,当超时,cookie删除
当seconds<0,浏览器会将Cookie保存在内存中,缺省值
当seconds=0,浏览器会立即删除cookie;
SUN公司提供的Cookie的API中没有提供直接删除cookie的方法
比如:要删除一个名称为"username"的cookie:
Cookie c = new Cookie("username","");
c.setMaxAge(0);
response.setCookie(c);
练习:
- 写一个Servlet,该Servlet先查看有没有一个名称为"cart"的Cookie,如果有,则显示该Cookie的值,如果没有,则添加该Cookie
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
Cookie[] cookies = request.getCookies();
if(cookies != null){
boolean flag = false;
for(Cookie cookie : cookies){
String name = cookie.getName();
if("cart".equals(name)){
String value = cookie.getValue();
out.println("<h2>已经存在名为cart的Cookie:"+value + "</h2>");
flag = true;
}
}
if(!flag){
Cookie newCookie = new Cookie("cart", "123");
response.addCookie(newCookie);
out.println("<h1>已经添加名为cart的Cookie</h1>");
}
}else{
Cookie newCookie = new Cookie("cart", "123");
response.addCookie(newCookie);
out.println("<h1>已经添加名为cart的Cookie</h1>");
}
(6) Cookie的编码问题
- 什么是Cookie的编码问题?
Cookie只能存放合法的ASCII码字符,中文需要转换成合法的ASCII码字符形式才能存放!(Tomcat高本版已经经过处理)
设置Cookie的时候URL编码
String URLEncoder.encode(String str , String charset);
读取Cookie的时候URL解码
String URLDecoder.decode(String str , String charset);
建议:不管是否为中文,最好统一进行编码,避免不合法的ASCII码字符
(7) Cookie的路径问题
- 什么是Cookie的路径
浏览器访问服务器会比较请求地址是否与Cookie的路径匹配,只有匹配的Cookie才会被发送出去.
- Cooki的默认路径
Cookie的默认路径 = 添加该Cookie的组件(Servlet/JSP)路径
比如:/day06/biz01/addCookie.jsp添加了一个cookie,则该cookie的路径为/day06/biz01
匹配规则:请求路径(地址)必须等于Cookie的路径或者是Cookie的子路径
比如,cookie的路径是"/day06/biz01",则访问如下地址
/day06/findCookie1.jsp no
/day06/biz01/findCookie2.jsp yes
/day06/biz01/sub/findCookie3.jsp yes
- 修改Cookie的路径
cookie.setPath(String path);//缺省路径为web组件所在路径