一、会话技术
二、Cookie
1.概念
2.入门
@WebServlet("/CookieDemo1")
public class CookieDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1、创建Cookie对象
Cookie c = new Cookie("msg","hello");
// 2、发送Cookie
response.addCookie(c);//发送给浏览器
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
再新建一个servlet对象来获取cookie:
@WebServlet("/CookieDemo2")
public class CookieDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cs = request.getCookies();
// 获取数据
if(cs!=null){
for(Cookie c : cs){
String name = c.getName();
String value = c.getValue();
System.out.println(name+ ":" +value);
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
测试结果:
先用Demo1发送
再访问Demo2
3.Cookie实现原理
原理图:
CookieDemo1根据客户端请求,给出响应,此响应返回给客户端,客户端将cookie内容保存在客户端,此时再一次发送请求,会话内容就被客户端带着访问CookieDemo2,然后服务器端给出响应。
它是基于响应头set-cookie和请求头cookie实现
抓包CookieDemo1 ,在响应头中发现了Set-Cookie:msg = hello
抓包CookieDemo2,此时信息在请求头中出现
4.Cookie的细节
回家:一次可以发送多个cookie吗?-----可以
可以创建多个cookie对象实现
@WebServlet("/CookieDemo1")
public class CookieDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1、创建Cookie对象
Cookie c1 = new Cookie("msg","hello");
Cookie c2 = new Cookie("name","Jerry");
// 2、发送Cookie
response.addCookie(c1);//发送给浏览器
response.addCookie(c2);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
查看Set-Cookie,有两个
cookie在浏览器中保存多长时间?
回答:
默认情况下,浏览器关闭,内存释放,cookie文件销毁。
设置持久化存储
setMaxAge(int seconds)
传递正数:持久化存储,存活时间
负数:默认值(存在浏览器中,浏览器关闭后销毁)
0:删除cookie信息
@WebServlet("/CookieDemo1")
public class CookieDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1、创建Cookie对象
Cookie c1 = new Cookie("msg","hello");
// 2.设置cookie存活时间
c1.setMaxAge(30); // 将cookie持久化到硬盘,30秒后自动删除
// c1.setMaxAge(-1); 默认模式
// c1.setMaxAge(0); 删除
// 3、发送Cookie
response.addCookie(c1);//发送给浏览器
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
cookie能不能存中文?
回答:tomcat8之后可以存中文
Cookie c1 = new Cookie("msg","你好");
cookie获取范围有多大,共享问题?
如果在tomcat有多个项目,在这些web项目中cookie能不能共享?
默认情况下不可以
但是可以设置:
setPath(String path):设置cookie的获取范围,默认情况下,设置当前虚拟目录
将setPath(String path) 里的path设为“/”就可以实现共享
在Demo1下:
@WebServlet("/CookieDemo1")
public class CookieDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1、创建Cookie对象
Cookie c1 = new Cookie("msg","你好");
c1.setPath("/");
// 2、发送Cookie
response.addCookie(c1);//发送给浏览器
}
新建,module
设置两个web项目
@WebServlet("/CookieDemo")
public class CookieDemo extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取cookie
System.out.println("day06");
Cookie[] cs = request.getCookies();
// 获取数据
if(cs!=null){
for(Cookie c : cs){
String name = c.getName();
String value = c.getValue();
System.out.println(name+ ":" +value);
}
}
}
测试 :可以访问
不同的tomcat服务器间cookie共享问题?
setDomain(String path) :如果设置一级域名相同,那么多个服务器的cookie可以共享
比如:
setDomain(".baidu.com")。那么tieba.baidu.com和news.baidu.com中cookie共享
5.cookie的特点
特点:
cookie存储数据在客户端浏览器
浏览器对于单个cookie的大小有限制(4kb)以及 对同一域名下的中cookie数量有限制
作用:
cookie一般用于存储少量的不太敏感的数据
在不登录的情况下,完成服务器对客户端的身份识别