Cookie
概念
- Cookie是客户端会话技术,将数据保存到客户端。默认情况下:只要浏览器不关闭,用户再次发送请求的时候,会自动将运行内存中的cookie发送给服务器。
- cookie保存方式
- 可以保存在运行内存中。(浏览器只要关闭cookie就消失了。)
- 可以保存在客户端硬盘文件中。(设置保存时间)
快速入门
- 使用步骤:
-
创建Cookie对象,绑定数据
new Cookie(String name, String value)
-
设置cookie的path(cookie关联的路径):
setPath(String path);
-
发送Cookie对象
response.addCookie(Cookie cookie)
-
获取Cookie,拿到数据
Cookie[] request.getCookies()
获取cookie的键值对
Stringname = cookie.getName();
String value = cookie.getValue();
-
实现原理
基于响应头set-cookie和请求头cookie实现
-
cookie的细节
一次可以设置多个cookie
cookie可以在浏览器存储多次时间
默认情况下:当浏览器关闭后,Cookie销毁持久化存储:
cookie.setMaxaAge(int seconds)
设置cookie的存储时间。- 正数:将cookie数据存储到硬盘中,并按指定的时间存储,时间到后自
销毁。 - 0:删除同名cookie信息
- 负数(默认情况):当浏览器关闭时自动清除
- 正数:将cookie数据存储到硬盘中,并按指定的时间存储,时间到后自
-
cookie能不能存中文?
- 在tomcat 8 之前 cookie中不能直接存储中文数据:需要将中文数据转码—一般采用URL编码(%E3)
- 在tomcat 8 之后,cookie支持中文数据。特殊字符还是不支持,建议使用URL编码存储,URL解码解析
编码:URLEncoder.encode(formatDate, "utf-8");
(formatDate:要编码的数据)
解码:URLDecoder.decode(value, "utf-8");
(value:要解码的数据)
-
cookie共享问题?
- 假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?
- 默认情况下cookie不能共享。
- setPath(String path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录,当前项目下所有路径共享。
- 如果要实现Tomcat中多个web项目共享,则可以将path设置为"/"。
- 假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?
-
不同的tomcat服务器间cookie共享问题?
-
setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享
-
setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以共享
-
Cookie的特点和作用
- cookie存储数据在客户端浏览器.
- 浏览器对于单个cookie 的大小有限制(4kb) 以及 对同一个域名下的总cookie数量也有限制(20个)
作用:
- cookie一般用于存出少量的不太敏感的数据。
- 在不登录的情况下,完成服务器对客户端的身份识别。
案例(十天内免登陆)
部分代码
创建cookie:
//创建cookie对象
Cookie cookie1 = new Cookie("username", username);
Cookie cookie2 = new Cookie("password", password);
//设置cookie的存储时间
cookie1.setMaxAge(60 * 60 * 24 * 10);
cookie2.setMaxAge(60 * 60 * 24 * 10);
//设置cookie的path (只要访问这个应用,浏览器就会携带连个cookie对象)
cookie1.setPath(request.getContextPath());
cookie2.setPath(request.getContextPath());
//相应cookie对象给浏览器
response.addCookie(cookie1);
response.addCookie(cookie2);
删除cookie:
//清除存储的登录信息
Cookie[] cookies = request.getCookies();
if (cookies != null){
for (Cookie cookie : cookies) {
String name = cookie.getName();
if ("username".equals(name) || "password".equals(name)){
cookie.setMaxAge(0);//删除同名cookie
cookie.setPath(request.getContextPath());//必须设置(创建cookie时关联的路径)
response.addCookie(cookie);//必须发送cookie
}
}
}