目录
一、会话控制引入
Http是无状态的
- HTTP 无状态 :服务器无法判断这两次请求是同一个客户端发过来的,还是不同的客户端发过来的
- 无状态带来的现实问题:第一次请求是添加商品到购物车,第二次请求是结账;如果这两次请求服务器无法区分是同一个用户的,那么就会导致混乱
- 通过会话跟踪技术来解决无状态的问题。
什么是 Session 会话?
1、 Session 就一个接口(HttpSession) 。
2、 Session 就是会话。 它是用来维护一个客户端和服务器之间关联的一种技术。
3、 每个客户端都有自己的一个 Session 会话。
4、 Session 会话中, 我们经常用来保存用户登录之后的信息。
会话跟踪技术
- 客户端第一次发请求给服务器,服务器获取session,获取不到,则创建新的,然后响应给客户端
- 下次客户端给服务器发请求时,会把sessionID带给服务器,那么服务器就能获取到了,那么服务器就判断这一次请求和上次某次请求是同一个客户端,从而能够区分开客户端
二、Cookie
本质:
- 在浏览器端临时存储数据
- 键值对
- 键和值都是字符串类型
- 数据量很小
-
客户端有了 Cookie 后, 每次请求都发送给服务器。
-
每个 Cookie 的大小不能超过 4kb
2.1 创建/获取 Cookie
// 1.创建Cookie对象
Cookie cookie = new Cookie("cookie-message", "hello-cookie");
// 2.将Cookie对象添加到响应中
response.addCookie(cookie);
// 3.服务器获取客户端的 Cookie 只需要一行代码
Cookie[] cookies = req.getCookies();
2.2 Cookie的修改
- 方案一:
- 1、 先创建一个要修改的同名(指的就是 key) 的 Cookie 对象
- 2、 在构造器, 同时赋于新的 Cookie 值。
- 3、 调用 response.addCookie( Cookie );
- 方案二:
- 1、 先查找到需要修改的 Cookie 对象
- 2、 调用 setValue()方法赋于新的 Cookie 值。
- 3、 调用 response.addCookie()通知客户端保存修改
2.3 Cookie的生命周期
- 会话级Cookie
- 服务器端并没有明确指定Cookie的存在时间
- 在浏览器端,Cookie数据存在于内存中
- 只要浏览器还开着,Cookie数据就一直都在
- 浏览器关闭,内存中的Cookie数据就会被释放
- 持久化Cookie
- 服务器端明确设置了Cookie的存在时间
- 在浏览器端,Cookie数据会被保存到硬盘上
- Cookie在硬盘上存在的时间根据服务器端限定的时间来管控,不受浏览器关闭的影响
- 持久化Cookie到达了预设的时间会被释放
// 给Cookie设置过期时间
// 正数:Cookie的过期时间,以秒为单位
// 负数:表示这个Cookie是会话级的Cookie,浏览器关闭时释放
// 0:通知浏览器立即删除这个Cookie
cookie.setMaxAge(20);
三、Session创建与使用
request.getSession() -> 获取当前的会话,没有则创建一个新的会话
request.getSession(true) -> 效果和不带参数相同
request.getSession(false) -> 获取当前会话,没有则返回null,不会创建新的
session.getId() -> 获取sessionID
session.isNew() -> 判断当前session是否是新的
session.getMaxInactiveInterval() -> session的非激活间隔时长,默认1800秒
session.setMaxInactiveInterval() -> 设置session的非激活间隔时长
session.invalidate() -> 强制性让会话立即失效
- Session 域数据的存取
在session域保存数据
setAttribute("key1", "value1"); -> 保存一个 k-v 值
在session域读取数据
getAttribute("key1");
删除session域的数据
removeAttribute(k)