一、什么是cookie?
cookie是服务器通知客户端保存键值对的一种技术。客户端有了cookie后,每次请求都会将cookie发送给服务器;每个cookie的大小不能超过4kb;
二、创建cookie
//服务端创建cookie
Cookie cookie = new Cookie(“key”,“value”);
//通知客户端保存cookie
responce.addCookie(cookie);
响应头出现Set-Cookie项,浏览器去查找有没有相关的cookie,如果没有cookie就创建;有的话就把值替换;
cookie的创建过程:
三、获取cookie
浏览器在向服务器发送请求时,会携带自己保存的所有cookie(cookie信息在请求头cookie内);
服务器获取浏览器发送过来的cookie:
Cookie[] cookies = request.getCookies();
获取cookie只有getCookies()这一个方法,得到的是cookie数组;如果我们想要获取某一个cookie,也只能遍历返回的cookie数组;
创建一个获取指定key值的cookie的工具类:
public class CookieUtils{
public static Cookie getCookie(String key,Cookies[] cookies){
if(key==null||cookies==null||cookies.length==0){
return null;
}
for(int i=0;i<cookies.length;i++){
if(key.equals(cookies[i].getName())){
return cookies[i];
}
}
return null;
}
}
四、cookie值的修改
假设现在浏览器保存着一个cookie(key1 = value1);
我们想要修改这个cookie的value值,有两种方式;
第一种方案:
服务器创建一个同名的cookie,发送给客户端;
Cookie cookie = new Cookie(“key1”,“value2”);
responce.addCookie(cookie);
这时浏览器保存的键为key1的cookie的值就会发生改变;
第二种方案:
在服务端找到需要修改的cookie,调用setValue()方法;
五、火狐浏览器查看cookie
六、cookie生命控制
cookie的生命控制指的是如何管理cookie什么时候被销毁,使用setMaxAge()进行控制;参数默认是负数;
如果参数是正数,表示该cookie的最长生活时间,单位是秒;
如果参数是负数,表示cookie在浏览器关闭后就被销毁;
如果是 0 ,表示cookie在创建完后就被销毁。
七、设置path属性
cookie的path属性可以有效过滤哪些cookie发送给服务器,哪些不发送;
创建一个cookie后,调用setPath()方法,设置当前cookie的path属性;当浏览器发送请求时,如果cookie的path属性的值满足浏览器发送的请求的URL,那么该cookie才会发送;
八、相关问题
1、cookie能不能存储中文?
在tomcat8之前cookie中不能直接存储中文数据,需要将中文数据转码,一般采用URL编码(%E3);
在tomcat8之后cookie支持中文数据。特殊字符还是不支持,建议使用URL编码存储,URL解码解析
2、cookie共享问题
(1)假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享? 默认情况下cookie不能共享,因为cookie的path属性的值为当前工程;将cookie的path属性设置"/",就能实现不同的项目访问同一个cookie。
(2)不同的tomcat服务器间cookie共享问题?
setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享;
假如:setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以共享。
九、案例
使用cookie实现记住上一次访问时间;
实现思路: