文章目录
关于会话
- 什么是会话?
会话是浏览器和服务器之间发生的一系列请求和响应的过程。
会话开始: 打开浏览器-访问京东
会话结束:关闭浏览器 - 会话产生的数据
在客户端与服务器端交互的过程中,也会产生一些数据。为了保存会话过程中产生的数据,在Servlet技术中,提供了两个用于保存会话数据的对象,分别是Cookie和Session - 本质就是在浏览器或者服务器存取数据的技术
Cookie概述
Cookie技术就是在浏览器端存取会话的数据
Cookie特点
- 数据是key-value键值对的形式 name=jack
- 数据有存活时间,并且可以修改
- 不能识别一些特殊符号,所以需要对这个符号进行转码(编码解码)
- 一个Cookie只能存储一个键值对key-value
- cokie是浏览器保存会话数据的技术,
Cookie的执行流程
- (1)浏览器第一次访问Servlet,创建一个Cookie对象(默认保存一个键值对JSESSIONID)
- (2)Servlet将生成的Cookie发送到浏览器
- (3)浏览器自动保存
- (4)第二次访问服务器Servlet,浏览器自动将Cookie数据获取放在请求中
(1)Cookie的创建
Cookie(String name, String value) 创建cookie对象
String getName()获取cookie的名称
String getValue() 获取cookie的值
创建和获取Cookie
-
Cookie的创建
- Cookie(String name, String value) 创建cookie对象
- String getName()获取cookie的名称
- String getValue() 获取cookie的值 -
将Cookie发送给服务器
response.addCookie(Cookie cookie); -
Cookie的获取
Cookie[] getCookies() 获取浏览器发送的cookie
Cookie[] cookies = request.getCookies();(如果没有cookie会返回一个null)
实现案例
通过SetCookieServlet
设置Cookie,再通过GetCookieServlet
获取Cookie。
@WebServlet("/SetCookieServlet")
public class SetCookieServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//一个cookie只能存储一个键值对key-value cokie是浏览器保存会话数据的技术,
//保存cookie,保存账号密码,第二次的时候,浏览器会自动放到request请求中 将其带数据到服务器里面并显示,自动验证
//1、创建cookie 一个cookie只有一个键值对
Cookie cookie1 = new Cookie("username", "Strive_GF");
Cookie cookie2 = new Cookie("password", "123456");
//2、将Cookie发送给浏览器
response.addCookie(cookie1);
response.addCookie(cookie2);
}
}
@WebServlet("/GetCookieServlet ")
public class GetCookieServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取cookie ,第二次开始访问网站,此时浏览器会自动地将保存的cookie放到请求带到Servlet
Cookie[] cookies = request.getCookies();//一个cookie都没有 getCookie()方法返回的是null
if(cookies != null){
//循环所有的cookie
for(Cookie cookie:cookies){
System.out.println(cookie.getName()+" : "+cookie.getValue());
}
}else{
System.out.println("没有查询到cookie");
}
}
}
运行结果:
- 直接运行
GetCookieServlet
2.先运行SetCookieServlet
给cookie设值,再通过GetCookieServlet
获取cookie值
- 关闭浏览器之后直接通过url地址
GetCookieServlet
获取cookie
Cookie存活时间
void setMaxAge(int expiry) 设置cookie的最大生存时间(单位:秒)
(1)默认情况下,浏览器中Cookie的存活时间是一个会话
(2)我们有时候需要设置Cookie的 存活时间
如果你设置了setMaxAge,Cookie就会按存活时间保存在硬盘中
案例实现
@WebServlet("/SetMaxAgeServlet")
public class SetMaxAgeServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建cookie对象
Cookie cookie1 = new Cookie("username","Strive_GF");
Cookie cookie2 = new Cookie("password","1234");
//设置cookie的存活时间 单位是秒,这里是一天
cookie1.setMaxAge(24*60*60);
cookie2.setMaxAge(24*60*60);
//将cookie发送给服务器 因为cookie是浏览器保存会话数据的技术 ,所以必须将cookie发给浏览器
response.addCookie(cookie1);
response.addCookie(cookie2);
}
}
运行结果:
- 运行
SetMaxAgeServlet
设置cookie,并通过上文的GetCookieServlet
来获取Cookie
- 再次关闭浏览器,通过
GetCookieServlet
Cookie的访问路径
- void setPath(String uri)
设置cookie的路径 —— 浏览器会根据这个路径判断哪些cookie要发送给服务器,不是这个服务器下的cookie就不会发送给该服务器(比如:淘宝、京东你都设置了自动登录,账号相同但是密码不同,这时候就需要设置这个访问路径,来让对应的cookie发送给对应的服务器)
- 方式1:/webName/ 当访问webName项目下的所有资源,请求都会携带Cookie**【默认方式】**
- 方式2:/webName/user 当访问webName项目下的user模块下的所有资源,请求都会携带Cookie
- 方式3:/ 当访问服务器中所有资源,请求都会携带Cookie
案例实现
@WebServlet("/SetPathServlet")
public class SetPathServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建cookie对象
Cookie cookie1 = new Cookie("username","Strive_GF_SetPathServlet");
Cookie cookie2 = new Cookie("password","123456");
//设置cookie的存活时间 单位是秒,这里是一天
cookie1.setMaxAge(24*60*60);
cookie2.setMaxAge(24*60*60);
//request.getContextPath() 获取当前项目名称 设置
cookie1.setPath(request.getContextPath());
cookie2.setPath(request.getContextPath());
//将cookie发送给服务器 因为cookie是浏览器保存会话数据的技术 ,所以必须将cookie发给浏览器
response.addCookie(cookie1);
response.addCookie(cookie2);
}
}
@WebServlet("/SetPath_TaoBao_Servlet")
public class SetPath_TaoBao_Servletextends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建cookie对象
Cookie cookie1 = new Cookie("username","SetPath_TaoBao_Servlet");
Cookie cookie2 = new Cookie("password","123456");
//设置cookie的存活时间 单位是秒,这里是一天
cookie1.setMaxAge(24*60*60);
cookie2.setMaxAge(24*60*60);
//将cookie访问路径设置为/taobao
cookie1.setPath("/taobao");
cookie2.setPath("/taobao");
//request.getContextPath() 获取当前项目名称 设置
// cookie1.setPath(request.getContextPath());
// cookie2.setPath(request.getContextPath());
//将cookie发送给服务器 因为cookie是浏览器保存会话数据的技术 ,所以必须将cookie发给浏览器
response.addCookie(cookie1);
response.addCookie(cookie2);
}
}
运行结果:
- 通过
SetPathServlet
设置项目的访问路径为当项目路径,再通过GetCookieServlet
获取
- 先运行
SetPath_TaoBao_Servlet
将cookie.setPath(“/taobao”)再运行GetCookieServlet
获取cookie
Cookie的清除
并没有清除Cookie的方法,但是可以通过以下两种方式来达到清除cookie的目的:
- 可以修改存活时间为0
将cookie的生存时间设置为0(cookie.setMaxAge(0)) - 可以使用空值覆盖原值的方法来达到清除cookie的目的,后一个用来覆盖cookie必须名称与路径与原来的cookie一致
再创建一次cookie,key与原来的一样,值设置为""空值,达到清除效果
案例实现
//1、修改存活时间为0
@WebServlet("/ClearCookieServlet_1")
public class ClearCookieServlet_1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建cookie对象
Cookie cookie1 = new Cookie("username","ClearCookieServlet_1");
Cookie cookie2 = new Cookie("password","123456");
//设置cookie的存活时间为0 也就是创建即销毁
cookie1.setMaxAge(0);
cookie2.setMaxAge(0);
//将cookie发送给服务器
response.addCookie(cookie1);
response.addCookie(cookie2);
}
}
//2、使用空值覆盖原值的方法来达到清除cookie的目的
@WebServlet("/ClearCookieServlet_2")
public class ClearCookieServlet_2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通过值覆盖 设置cookie中对应的key的值为""空来达到清除cookie的目的
Cookie cookie1 = new Cookie("username","");
Cookie cookie2 = new Cookie("password","");
cookie1.setMaxAge(24*60*60);
cookie2.setMaxAge(24*60*60);
//发送给服务器
response.addCookie(cookie1);
response.addCookie(cookie2);
}
}
运行结果
- 通过
ClearCookieServlet_1
将cookie存活时间修改为0,再通过GetCookieServlet
获取cookie
- 通过
ClearCookieServlet_2
将cookie的值覆盖为空值"",再调用GetCookieServlet
获取cookie
注意:建议使用第一种方式来清除cookie,第二种方式,只是空值覆盖
Cookie的编码问题
原因:
- Cookie不能识别一些特殊符号,所以需要对这个符号进行转码(编码和解码),防止出现一些不认识的乱码先写
- 编码: URLEncoder.encode(date, “UTF-8”)
- 解码: URLDecoder.decode(date, “UTF-8”) - 有的值cookie不能保存,则先编码再保存
案例实现
- 我们先看没有进行转码的现象
@WebServlet("/EncodeServlet")
public class EncodeServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建cookie对象
Cookie cookie1 = new Cookie("username", URLEncoder.encode("我叫浪夏一学 2020年9月12日17:43:02"));
Cookie cookie2 = new Cookie("password", URLEncoder.encode("中国1234"));
//设置cookie对象存活期
cookie1.setMaxAge(24*60*60);
cookie2.setMaxAge(24*60*60);
//发送给服务器
response.addCookie(cookie1);
response.addCookie(cookie2);
}
}
通过EncodeServlet
设置cookie,再通过GetCookieServlet
获取
2.通过encode和decode编码解码来实现
@WebServlet("/EncodeServlet")
public class EncodeServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建cookie对象
// Cookie cookie1 = new Cookie("username", URLEncoder.encode("我叫浪夏一学 2020年9月12日17:43:02"));
// Cookie cookie2 = new Cookie("password", URLEncoder.encode("中国1234"));
//通过URLEncoder.encode()编码
Cookie cookie1 = new Cookie("username", URLEncoder.encode("我叫浪夏一学 2020年9月12日17:43:02","utf-8"));
Cookie cookie2 = new Cookie("password", URLEncoder.encode("中国1234","utf-8"));
//设置cookie对象存活期
cookie1.setMaxAge(24*60*60);
cookie2.setMaxAge(24*60*60);
//发送给服务器
response.addCookie(cookie1);
response.addCookie(cookie2);
}
}
@WebServlet("/DecodeServlet")
public class DecodeServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取cookie数组
Cookie[] cookies = request.getCookies();
if(cookies != null){
//循环所有的cookie
for(Cookie cookie:cookies){
//URLDecoder.decode()对其解码
System.out.println(cookie.getName()+" "+ URLDecoder.decode(cookie.getValue(),"utf-8"));
}
}else{
System.out.println("没有查询到cookie");
}
}
}
运行结果:
先通过EncodeServlet
对其编码,在通过DecodeServlet
解码输出