目录
1.前言
2.正文
2.3设置session
3.小结
1.前言
哈喽大家好吖,今天继续来给大家来分享SpringMVC的学习,今天主要带来的是cookie与session的讲解以及通过postman和fiddler来实战,废话不多说让我们开始吧。
2.正文
2.1cookie与session概念
2.1.1.为什么需要 Cookie 和 Session?
HTTP 协议是无状态的,服务器无法自动识别两次请求是否来自同一个用户。Cookie 和 Session 的作用就是在无状态的 HTTP 协议基础上,实现用户身份识别和状态保持。
cookie是存储在客户端上的,session是存储在服务器上的。cookie中存储着sessionID。
2.1.2通俗理解
Cookie:像一张"会员卡",由服务器发放,浏览器保存,每次访问时自动出示。
Session:像"保险箱",数据存储在服务器,用户通过"钥匙"(Session ID)访问自己的数据。
2.1.3cookie
1. 定义
Cookie 是服务器发送给浏览器的一小段文本信息(通常 4KB 以内),浏览器会保存并在后续请求中自动携带。
2. 工作原理
客户端首次访问服务器
服务器通过
Set-Cookie
响应头下发 Cookie浏览器后续请求自动通过
Cookie
请求头发送 Cookie
2.1.4session
1. 定义
Session 是服务器端存储的用户会话数据,通过唯一的 Session ID 标识用户,该 ID 通常通过 Cookie 传递。
2. 工作原理
客户端首次访问服务器
服务器创建 Session 并生成 Session ID
通过
Set-Cookie
下发 Session ID浏览器后续请求携带 Session ID
服务器通过 Session ID 查找用户数据
讲解完基础概念后我们就要开始写代码啦。
2.2返回cookie参数
返回所有cookie:
@RequestMapping("/r11") // 1. 定义路由映射
public String r11(HttpServletRequest request){ // 2. 方法参数注入// 3. 获取 Cookie 数组Cookie[] cookies = request.getCookies();// 4. 非空检查if(cookies != null){// 5. 遍历 Cookie 数组for(Cookie cookie : cookies){// 6. 打印每个 Cookie 的名称和值System.out.println(cookie.getName() + ":" + cookie.getValue());}}// 7. 返回响应return "返回所有cookie成功";
}
关键点详解:
@RequestMapping("/r11")
这是一个 Spring MVC 注解
表示当访问
/r11
路径时,会执行这个方法等价于
@GetMapping("/r11")
(如果只处理 GET 请求)
HttpServletRequest request
Spring 会自动注入当前 HTTP 请求对象
该对象包含请求的所有信息(头信息、参数、Cookie 等)
request.getCookies()
重要方法:从请求中获取所有 Cookie
返回
Cookie[]
数组(可能为 null)每个 Cookie 对象包含:
getName()
:获取 Cookie 名称
getValue()
:获取 Cookie 值其他方法:
getDomain()
,getPath()
,isHttpOnly()
等非空检查
必须检查
cookies != null
如果浏览器没有发送任何 Cookie,该方法返回 null
不检查会导致
NullPointerException
Cookie 遍历
使用增强 for 循环遍历数组
每个
Cookie
对象代表一个键值对
在浏览器中打开该网页,接下来通过fiddler抓包工具对其抓包:
另外我们可以在postman设置cookies的值,格式是键值对。
通过postman也可以进行连接:
返回某个键值对的值:
//返回cookie中单个键的值@RequestMapping("/r12")public String r12(@CookieValue ("name") String name){return "cookie该key的值" + name;}
关键点详解:
@RequestMapping("/r12")
定义了一个处理 HTTP 请求的端点
默认支持所有 HTTP 方法(GET/POST等)
建议明确指定方法类型,如
@GetMapping
@CookieValue("name")
Spring MVC 提供的注解
自动从请求的 Cookie 中提取名为 "name" 的值
注入到方法参数
String name
中返回值处理
直接拼接字符串返回
2.3设置session
存储session:
@RequestMapping("/r13") // 1. 定义路由端点
public String setSession(HttpServletRequest request) { // 2. 注入请求对象// 3. 获取或创建 SessionHttpSession session = request.getSession();// 4. 存储数据到 Sessionsession.setAttribute("name", "jerry");session.setAttribute("age", 20);// 5. 返回响应return "session设置成功";
}
关键点详解
request.getSession()
核心方法,获取当前会话的
HttpSession
对象重要特性:
如果 Session 不存在,会自动创建新 Session
等价于
request.getSession(true)
如果不想自动创建,可使用
request.getSession(false)
setAttribute()
方法
存储数据的标准方式
参数说明:
void setAttribute(String name, Object value)
可以存储任何可序列化的 Java 对象
相同 name 会覆盖旧值
Session 生命周期
创建:第一次调用
getSession()
时销毁:
调用
session.invalidate()
超过配置的超时时间(默认 30 分钟)
服务器重启(如果使用内存存储)
进行抓包:
三种获取session的方式:
方法一:通过 HttpServletRequest 获取
@RequestMapping("/r14") public String getSession1(HttpServletRequest request) {// 获取现有 Session,不自动创建新 SessionHttpSession session = request.getSession(false);if (session == null) {return "用户未登录";} else {// 从 Session 获取属性并强制类型转换String name = (String) session.getAttribute("name");return "登录用户为:" + name;} }
request.getSession(false)
:
参数
false
表示不自动创建新 Session如果 Session 不存在则返回
null
安全校验:
显式检查
session == null
处理未登录情况避免直接操作可能为 null 的 Session
类型转换:
getAttribute()
返回Object
类型需要强制转换为目标类型(这里是
String
)
方法二:直接注入 HttpSession
@RequestMapping("/r15") public String getSession2(HttpSession session) {// 直接使用注入的 Session 对象String name = (String) session.getAttribute("name");return "登录用户为: " + name; }
自动注入:
Spring 会自动注入当前请求的
HttpSession
等价于
request.getSession(true)
行为特点:
如果 Session 不存在会自动创建新 Session
可能导致不必要的 Session 创建
空值风险:
name
属性可能不存在(返回null
)
方法三:使用 @SessionAttribute 注解
@RequestMapping("/r16") public String getSession3(@SessionAttribute("name") String name) {return "登录用户为: " + name; }
注解特性:
直接从 Session 中提取指定属性
自动完成类型转换(无需显式强转)
异常处理:
如果属性不存在会抛出
HttpSessionRequiredException
可以使用
required = false
避免与
@ModelAttribute
的区别:
@SessionAttribute
只从 Session 读取
@ModelAttribute
会先检查 Session 再检查请求参数
方法 | 特点 | 适用场景 | 是否自动创建 Session |
---|---|---|---|
r14 | 通过 HttpServletRequest 获取 | 需要精确控制 Session 创建 | 可控制 (false) |
r15 | 直接注入 HttpSession | 简单读取场景 | 自动创建 (true) |
r16 | 使用 @SessionAttribute 注解 | 需要特定 Session 属性 | 自动创建 (true) |
3.小结
今天的分享到这里就结束了,喜欢的小伙伴点点赞点点关注,你的支持就是对我最大的鼓励,大家加油!