概念
使用例子
原理
Cookie的使用
Cookie是保存在浏览器上的会话
Cookie在浏览器中保存的时间
默认情况下,当浏览器关闭后,Cookie数据被摧毁
持久化存储:setMaxAge(int seconds)
Cookie的共享范围
同一个服务器中,多个web项目共享
不同的tomcat服务器间Cookit共享
特点
作用
概念
客户端会话技术
使用例子
CookieDemo1写入Cookie,CookieDemo2获取Cookie
CookieDemo1代码
package com.lingaolu.cookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
/**
* @author 林高禄
* @create 2020-07-20-8:50
*/
@WebServlet("/cookieDemo1")
public class CookieDemo1 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie c1 = new Cookie("name","林大帅");
Cookie c2 = new Cookie("age","25");
response.addCookie(c1);
response.addCookie(c2);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
CookieDemo2代码
package com.lingaolu.cookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.util.stream.Stream;
/**
* @author 林高禄
* @create 2020-07-20-8:54
*/
@WebServlet("/cookieDemo2")
public class CookieDemo2 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cookies = request.getCookies();
StringBuilder str = new StringBuilder();
Stream.of(cookies).forEach(s->str.append(s.getName()).append(":").append(s.getValue()).append("<br>") );
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(str.toString());
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
运行先访问CookieDemo2,什么Cookie都没有
再访问CookieDemo1,写入Cookie,然后再访问CookieDemo2,CookieDemo1写入的Cookie就能访问到了
这样就访问到我们的Cookie了
原理
我们清除一下谷歌浏览器的Cookie数据
重新启动项目,我们访问CookieDemo1,F12看一下
访问CookieDemo1的时候,服务器收到了我们写入Response的Cookie,服务器把响应返给浏览器,那么浏览器就会保存这些Cookie
我们再访问CookieDemo2,F12看一下
访问CookieDemo1的时候,浏览器已经保存了我们写入的Cookie,所以访问CookieDemo2的时候,会把这些保存的Cookie放入请求头,这样我们就能获取到Cookie
通过上面例子,我们可以知道,Cookie可以发送多个,也能发送中文 (tomcat8),如果是tomcat8之前的版本,就需要进行URL进行转码
Cookie的使用
Cookie是保存在浏览器上的会话
上面的访问,我们已经知道谷歌浏览器访问CookieDemo2能拿到了我们的Cookie,那么我们用火狐浏览器访问CookieDemo2看一下
发现并没有任何Cookie数据,通过上面的原理我们就知道,因为我们访问CookieDemo1是通过谷歌浏览器访问的,所以会话的保存是保存在了谷歌浏览器,所以用火狐访问CookieDemo2的时候,并没有任何Cookie
我们用火狐浏览器访问CookieDemo1,写入Cookie到响应,这样Cookie也就保存在了火狐,这样火狐访问CookieDemo2的时候,也就能获取到Cookie了
Cookie在浏览器中保存的时间
默认情况下,当浏览器关闭后,Cookie数据被摧毁
我们访问CookieDemo2,可以访问到Cookie数据
现在我们关掉这个浏览器,再次打开浏览器访问CookieDemo2,就没有Cookie数据了
持久化存储:setMaxAge(int seconds)
seconds:
- 正数:将Cookie数据写到硬盘的文件中。持久化存储,seconds秒后自动删除
- 负数:默认值,关闭浏览器就会消失
- 零:删除
我们改下CookieDemo1的代码,将Cookie c1持久化到硬盘30秒
package com.lingaolu.cookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
/**
* @author 林高禄
* @create 2020-07-20-8:50
*/
@WebServlet("/cookieDemo1")
public class CookieDemo1 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie c1 = new Cookie("name","林大帅");
Cookie c2 = new Cookie("age","25");
// 将Cookie c1持久化到硬盘,30秒后自动删除
c1.setMaxAge(30);
response.addCookie(c1);
response.addCookie(c2);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
启动访问CookieDemo1
接着访问CookieDemo2
关闭浏览器,再次打开,再访问CookieDemo2
因为我们只把Cookie c1持久化到硬盘30秒,而Cookie c2没有持久化,所以关闭浏览器后,c2就被删除了,而c1还存在
过了30秒后,我们再刷新CookieDemo2,c1也被删除了
我们修改下CookieDemo1的代码,将Cookie c1持久化到硬盘1小时(足够时间修改代码,删除Cookie)
package com.lingaolu.cookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
/**
* @author 林高禄
* @create 2020-07-20-8:50
*/
@WebServlet("/cookieDemo1")
public class CookieDemo1 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie c1 = new Cookie("name","林大帅");
Cookie c2 = new Cookie("age","25");
// 将Cookie c1持久化到硬盘,30秒后自动删除
c1.setMaxAge(60*60);
response.addCookie(c1);
response.addCookie(c2);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
重启,访问CookieDemo1,关闭浏览器,再访问CookieDemo2
Cookie已被存在硬盘,时间1小时
现在我们修改CookieDemo1代码,把时间改为负数(删掉Cookie)
package com.lingaolu.cookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
/**
* @author 林高禄
* @create 2020-07-20-8:50
*/
@WebServlet("/cookieDemo1")
public class CookieDemo1 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie c1 = new Cookie("name","林大帅");
Cookie c2 = new Cookie("age","25");
// 将Cookie c1删除
c1.setMaxAge(0);
response.addCookie(c1);
response.addCookie(c2);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
启动,访问CookieDemo1
接着访问CookieDemo2
发现name没有了,也就是Cookie c1已经没有了,因为我们访问CookieDemo1的时候执行代码,删除了
Cookie的共享范围
同一个服务器中,多个web项目共享
我们再建一个web项目bServlet2,建一个类CookieDemo1,获取Cookie
然后部署bServlet的时候,把bServlet2也部署进来,部署在同一个服务器
取虚拟路径为web2
调整一下bServlet的 CookieDemo1代码,修改Cookie c1的Path为“/”
package com.lingaolu.cookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
/**
* @author 林高禄
* @create 2020-07-20-8:50
*/
@WebServlet("/cookieDemo1")
public class CookieDemo1 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie c1 = new Cookie("name","林大帅");
Cookie c2 = new Cookie("age","25");
c1.setPath("/");
// c2没有设置,默认为当前web项目的虚拟路径
response.addCookie(c1);
response.addCookie(c2);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
启动访问web的CookieDemo1
再访问web2的CookieDemo1
发现可以获取到Cookie c1的数据name,因为Cookie c1设置了Path为“/”,表示同一个服务器中共享,而bServlet2和bServlet在同一服务器中,所以bServlet2也能获取到。而Cookie c2没有设置,默认为当前web项目共享,也就是bServlet范围内共享,
不同的tomcat服务器间Cookit共享
setDomain(String path):如果设置一级域名相同,那么多个服务器之间Cookit共享
比如:setDomain(".baidu,com"),那么tieba..baidu,com和news.baidu,com中Cookit共享
特点
- Cookit存储数据在客户端浏览器
- 浏览器对于单个Cookit的大小有限制(4kb)以及对同一个域名下的总Cookit数量也有限制(20个)
作用
- Cookit一般用于存储少量的不太敏感的数据
- 在不登录的情况下,完成服务器对客户端的身份识别