【JavaWeb】Cookie、Session

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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

scj1022

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值