状态管理
(1)什么是状态管理
将浏览器与web服务器之间多次交互当做一个整体来看待,并且將多次交互所涉及的数据保存下来(2)Cookie
1)什么是Cookie?
服务器临时保存在浏览器端的少量的数据
2)cookie的工作原理
浏览器访问服务器时, 服务器会将少量数据以set-cookie消息头的方式发给浏览器,浏览器会将这些数据临时保存起来;当浏览器再次访问服务器时,会将之前保存的这些数据以cookie消息头的方式发送给服务器。
3)添加cookie
Cookie cook=new Cookie(String name,String value);//创建cook
//cookie.setMaxAge();
Response.addCookie(cook);//添加cookie
4)读取cookie
Cookie [] cook=request.getCookies();//注意该方法可能返回null
String name=cookie.getName();
String value=cookie.getValue();
5)编码问题
Cookie只能保存合法的ASCII字符,对于中文,需要将其转换成相应的ASCII字符的表现形式。URLEncoder.encode();//将中文设置成相应的ASCII
URLDecoder.decode();//将相应的ASCII码转换为中文
注意:添加cookie时建议最好统一编码处理
6)生存时间
Cookie.setMaxAge(int seconds)
默认浏览器会将cookie保存在内存里面。浏览器只要不关闭,cookie就一直存在,浏览器关闭,则cookie会被删除。
注意:
a.单位为秒
b.当seconds>0 浏览器会将cookie保存在硬盘上,当超过指定时间,浏览器会删除该cookie
当seconds<0 (缺省值)
当seconds=0 删除cookie
比如,要删除一个名称为“uid”的cookie:
Cookie c=new Cookie(“uid”,””);
c.setMaxAge(0);
response.addCookie(c);
7)路径问题
a.什么是cookie的路径问题?
浏览器在向服务器上的某个地址发送请求时,会比较该地址是否符合cookie路径的描述,只有符合要求的cookie才会被发送。
b.cookie默认路径
Cookie有一个默认路径,等于添加该cookie组件的路径。比如:/T-Test5/bz1/cookie1.jsp,则添加的cookie的路径就等于/T-Test5/bz1/
c.要访问的地址必须是cookie的路径或者其子路径
d.cookie.setPath(String path)
比如:cookie.setPath(“/T-Test5”)
注意:
* Cookie的path并不是设置这个Cookie在客户端的保存路径!!
* Cookie的path由服务器创建Cookie时设置
* 当浏览器访问服务器某个路径时,需要归还哪些Cookie给服务器呢?这由Cookie的path决定。
浏览器访问服务器的路径,如果包含某个Cookie的路径,那么就会归还这个Cookie。
* 例如:
aCookie.path=/day11_1/; bCookie.path=/day11_1/jsps/; cCookie.path=/day11_1/jsps/cookie/;
访问:/day11_1/index.jsp时,归还:aCookie
访问:/day11_1/jsps/a.jsp时,归还:aCookie、bCookie
访问:/day11_1/jsps/cookie/b.jsp时,归还:aCookie、bCookie、cCookie
Cookie的path默认值:当前访问路径的父路径。例如在访问/day11_1/jsps/a.jsp时,响应的cookie,那么这个cookie的默认path为/day11_1/jsps/
8)cookie的限制
a.cookie可以被禁止。
b.cookie不安全,对于敏感数据,尽量不要以cookie的方式保存。
c.cookie的大小有限制(大约4k左右)。
d.cookie的数量也有限制(大约300个)。
e.cookie只能保存字符串。
练习:获取用户上次登录时间
分析:
写一个Find_AddCookieServlet,该Servlet会先查询有没有一个名称为"uid"的cookie, 如果有,则显示该cookie的值;如果没有, 则添加之。cookie的值是当前系统时间
注:不用考虑生存时间
代码:
public class Find extends HttpServlet{
public void service(HttpServletRequest req,HttpServletResponse resp
)throw ServletException,IOException{
PrintWriter pw = resp.getWriter();
String time = getTime();
Cookie cook1=null;
cook1=new Cookie("uid",time);
if("/T-Test5/find.do".equals(uri)){
Cookie[] cooks=req.getCookies();
boolean tag=false;
if(cooks!=null){
for (Cookie cookie : cooks){
if(cookie.getName().equals("uid")){
pw.println("你上次登录的时间为:"+cookie.getValue()+"<br>");
tag=true;
//有,覆盖
resp.addCookie(cook1);
pw.println("你本次登录的时间为:"+cook1.getValue());
}
}if(!tag){
//无,添加
resp.addCookie(cook1);
pw.print("欢迎新用户");
}
}else{
//空,添加
resp.addCookie(cook1);
pw.print("新用户");
}
}
protected String getTime() {
Date date=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
String time=sdf.format(date);
return time;
}
(3)Cookie的用途
*服务器使用Cookie来跟踪客户端状态!
*保存购物车(购物车中的商品不能使用request保存,因为它是一个用户向服务器发送的多个请求信息)
*显示上次登录名(也是一个用户多个请求)
Cookie是不能跨浏览器的!
(4)JavaWeb中使用Cookie
*原始方式(了解):使用response发送Set-Cookie响应头
使用request获取Cookie请求头
*便捷方式(精通):
使用repsonse.addCookie()//方法向浏览器保存Cookie
使用request.getCookies()//方法获取浏览器归还的Cookie