给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。
Cookie可以被用户禁止
Cookie会将状态保存在浏览器端,不安全。对于敏感数据需要加密后再使用Cookie来保存
Cookie只能保存少量的数据,大约4kb左右
Cookie的个数是有限制的
Cookie只能保存字符串,且不能放中文字符串
不同的浏览器有不同的查看方式;以Chrome浏览器为例,点击URL前的 图标即可查看Cookie信息,例如:
或者右键检查元素
示例:
需求:
1)运行TestCookieServlet,保存username和pwd信息到Cookie并返回到客户端.
2)再运行GetCookieServlet,获取Cookie并进行显示
TestCookieServlet:
// 创建cookie对象
Cookie username=new Cookie("username","Alice");
Cookie pwd=new Cookie("pwd","abc123");
// 将Cookie保存到响应中
response.addCookie(username);
response.addCookie(pwd);
在浏览器中访问TestCookieServlet,localhost:8080/chapter04/TestCookieServlet;
可以查看到locahost保存了两个Cookie信息到客户端:
GetCookieServlet:
// 获取当前请求中的所有Cookie对象
Cookie[] cookies=request.getCookies();
// 输出所有Cookie的名字和值
if(cookies==null){
out.println("没有Cookie。");
return;
}
for(Cookie c:cookies){
out.println(c.getName()+"="+c.getValue());
}
4.设置cookie生存时间
修改TestCookieServlet
// 创建cookie对象
Cookie username=new Cookie("username","Alice");
Cookie pwd=new Cookie("pwd","abc123");
// 设置cookie的生命时间,24小时内有效
username.setMaxAge(24*3600);
pwd.setMaxAge(24*3600);
// 将Cookie保存到响应中
response.addCookie(username);
response.addCookie(pwd);
先运行TestCookieServlet,保证Cookie信息保存到客户端;
再运行GetCookieServlet,获取Cookie并进行显示;
将时间调到24小时后,再次访问GetCookieServlet,发现Cookie已经不存在
如果没有使用setMaxAge方法设置最大生命时间的Cookie,则浏览器关闭就失效;
5.解决cookie中文编码
cookie的值只能是ASCII字符;中文需要转换成ASCII码形式;使用
URLEncoder.encode()方法和URLDecoder.decode()方法实现。
EncodeServlet:
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//编码
String username = URLEncoder.encode("李想", "utf-8");
String country = URLEncoder.encode("中国", "utf-8");
//创建cookie
Cookie cookie1 = new Cookie("username", username);
Cookie cookie2 = new Cookie("country", country);
//添加响应的cookie
response.addCookie(cookie1);
response.addCookie(cookie2);
}
DecodeServlet
response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();Cookie[] cookies = request.getCookies();if(cookies!=null){for(Cookie cookie:cookies){String name = URLDecoder.decode(cookie.getName(), "utf-8");String value = URLDecoder.decode(cookie.getValue(), "utf-8");out.println(name+":");out.println(value+"<br/>");}}else{out.println("<h4>没有 cookies</h4>");}out.close();
}
访问encodeCookie,查看响应数据包
访问decodeCookie,查看页面输出
更多推荐
示例,详解,Cookie
发布评论