文章目录
- Cookie、Session
- 一、Cookie(客户端)
- 1、Cookie 的 特点
- 2、Cookie 的 工作原理
- 3、Cookie 的 基本操作
- 5、Cookie 的 域名与路径
- 6、Cookie 的 存活时间
- 7、Cookie 的 删除
- 二、Session(服务端)
- 1、Session 的 特点
- 2、Session 的 工作原理
- 3、Session 的 基本操作
- 4、Session 的 存活时间
- 5、Session 的 失效(Cookie导致)
Cookie、Session
一、Cookie(客户端)
Cookie 产生于服务端(服务器),保存在客户端(浏览器)。
- 将数据保存到客户端(浏览器),降低服务器压力。
1、Cookie 的 特点
- Cookie 的 数据类型:字符串的键值对
entry (name : value)
- Cookie 的 大小限制:4k(单个)
- Cookie 的 数量限制:同一域名下,不能超过50个
- Cookie 的 唯一性:同一域名下,Cookie 是唯一的(由 path 和 name 决定)
- Cookie 的 安全性:不安全(信息保存在用户的电脑上,相对来说都不安全)
2、Cookie 的 工作原理
服务器响应时,发送Cookie给浏览器(通过响应头Set-Cookie
)
浏览器访问时,携带Cookie到服务器(通过请求头Cookie
)
3、Cookie 的 基本操作
创建 Cookie,添加到 HttpServletResponse
对象中返回
// 创建cookie对象
Cookie cookie = new Cookie("product","xiaomi");
// 设置cookie作用的域名
cookie.setDomain("localhost");
// 设置cookie作用的路径(/代表一切路径)
cookie.setPath("/");
// 设置cookie的存活时间(单位是s,默认是-1,浏览器关闭即销毁)
cookie.setMaxAge(24 * 60 * 60);
// 添加Cookie到响应中(可以添加多个Cookie)
response.addCookie(cookie);
通过 HttpServletRequest
对象获取 Cookie
// 获取cookie对象
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
}
5、Cookie 的 域名与路径
// 设置cookie作用的域名
cookie.setDomain("localhost");
// 设置cookie作用的路径(/代表一切路径)
cookie.setPath("/");
域名 domain
:浏览器请求时,只会携带 域名 和 访问网站一致 的 cookie路径 path
:同一域名下,Cookie 是唯一的(由 path 和 name 决定)
下面举例说明:
Cookie A domain=localhost path=/a
Cookie B domain=localhost path=/a/b
访问 http://localhost:8080/a 携带 A
访问 http://localhost:8080/a/b 携带 A、B
访问 http://localhost:8080/b 不会携带
访问 http://www.baidu.com:8080/a 不会携带
6、Cookie 的 存活时间
// 设置cookie的存活时间(单位是s)
cookie.setMaxAge(24 * 60 * 60);
- 设置为
负数
:浏览器将Cookie保存在内存中,浏览器关闭,Cookie销毁。(没有设置 默认是-1
) - 设置为
正数
:浏览器将Cookie持久化到硬盘中,从浏览器接收到的时间开始算起,MaxAge
秒后到期。 - 设置为
0
:立即销毁。一般用于删除Cookie。
如果希望Cookie可以在多个会话中共享数据(浏览器多次打开关闭),需要设置MaxAge
为正数
。
7、Cookie 的 删除
- 浏览器端:在浏览器中手动清除Cookie
- 服务器端:发送一个存活时间为0的Cookie覆盖原来的Cookie即可(domain、path、name与要删除的cookie一致)
// 创建cookie对象(domain、path、name与要删除的cookie一致)
Cookie cookie = new Cookie("product","xiaomi");
cookie.setDomain("localhost");
cookie.setPath("/");
// 设置存活时间为0(立即销毁)
cookie.setMaxAge(0);
// 添加Cookie到响应中
response.addCookie(cookie);
二、Session(服务端)
Session 产生于服务端,保存在服务端。(将 JSESSIONID
通过 cookie
返回给客户端)
- 将数据保存到服务端(服务器),保证数据的安全性。
1、Session 的 特点
- Session 的 数据类型:任意类型的数据
Object
- Session 的 大小和数量:没有限制(取决于服务器的内存)
- Session 的 安全性:存储的数据相对安全。
2、Session 的 工作原理
Session 是基于 Cookie 实现的。每个 Session 都有一个唯一的编号 JESSIONID
。
服务器响应时,将 JESSIONID
通过 Cookie 发送给浏览器(通过响应头Set-Cookie
)
浏览器访问时,通过 Cookie 携带 JESSIONID
(通过请求头Cookie
)
通过唯一的编号 JESSIONID
,就能获取到对应的 Session
。
3、Session 的 基本操作
通过 HttpSession
对象进行 Session 的存取
// session不存在,新建session对象 | session已存在,返回已经存在的session
HttpSession session = request.getSession();
// 存储 session
session.setAttribute("userName", "zs");
// 获取 session 属性
Object userName = session.getAttribute("userName");
// 获取 session 的id
String sessionId = session.getId();
// 移除 session 属性
session.removeAttribute("userName");
// 销毁 HttpSession 对象
session.invalidate();
4、Session 的 存活时间
Session 的 存活时间 由HttpSession
的最大不活动时间决定(默认是30min)
代码中设置:
session.setMaxInactiveInterval(15 * 60); // 15分钟
配置文件中设置:
server.servlet.session.timeout=15m // 15分钟
5、Session 的 失效(Cookie导致)
由于 Session 是基于 Cookie 实现的,如果记录了 JSESSIONID
的 Cookie 被销毁,Session 也会失效。
- 默认情况下,记录了
JSESSIONID
的 Cookie 由 Tomcat 自动创建,没有设置存活时间,浏览器关闭即销毁。
解决方案:手动创建 name=JESSIONID 的 Cookie,替代 Tomcat 自动创建的 Cookie,并设置存活时间
HttpSession session = request.getSession();
session.setAttribute("userName", "zs");
String id = session.getId();
Cookie cookie = new Cookie("JSESSIONID", id);
cookie.setMaxAge(15 * 60); // 15分钟
response.addCookie(cookie);