当前位置: 首页 > news >正文

【SpringMVC】详解cookie,session及实战


目录

1.前言

2.正文

2.1cookie与session概念

2.2返回cookie参数

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. 工作原理

  1. 客户端首次访问服务器

  2. 服务器通过 Set-Cookie 响应头下发 Cookie

  3. 浏览器后续请求自动通过 Cookie 请求头发送 Cookie

2.1.4session

1. 定义

Session 是服务器端存储的用户会话数据,通过唯一的 Session ID 标识用户,该 ID 通常通过 Cookie 传递。

2. 工作原理

  1. 客户端首次访问服务器

  2. 服务器创建 Session 并生成 Session ID

  3. 通过 Set-Cookie 下发 Session ID

  4. 浏览器后续请求携带 Session ID

  5. 服务器通过 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成功";
}

关键点详解:

  1. @RequestMapping("/r11")

    • 这是一个 Spring MVC 注解

    • 表示当访问 /r11 路径时,会执行这个方法

    • 等价于 @GetMapping("/r11")(如果只处理 GET 请求)

  2. HttpServletRequest request

    • Spring 会自动注入当前 HTTP 请求对象

    • 该对象包含请求的所有信息(头信息、参数、Cookie 等)

  3. request.getCookies()

    • 重要方法:从请求中获取所有 Cookie

    • 返回 Cookie[] 数组(可能为 null)

    • 每个 Cookie 对象包含:

      • getName():获取 Cookie 名称

      • getValue():获取 Cookie 值

      • 其他方法:getDomain()getPath()isHttpOnly() 等

  4. 非空检查

    • 必须检查 cookies != null

    • 如果浏览器没有发送任何 Cookie,该方法返回 null

    • 不检查会导致 NullPointerException

  5. Cookie 遍历

    • 使用增强 for 循环遍历数组

    • 每个 Cookie 对象代表一个键值对

在浏览器中打开该网页,接下来通过fiddler抓包工具对其抓包: 

另外我们可以在postman设置cookies的值,格式是键值对。

通过postman也可以进行连接:


返回某个键值对的值: 

//返回cookie中单个键的值@RequestMapping("/r12")public String r12(@CookieValue ("name") String name){return "cookie该key的值" + name;}

 关键点详解:

 

  1. @RequestMapping("/r12")

    • 定义了一个处理 HTTP 请求的端点

    • 默认支持所有 HTTP 方法(GET/POST等)

    • 建议明确指定方法类型,如 @GetMapping

  2. @CookieValue("name")

    • Spring MVC 提供的注解

    • 自动从请求的 Cookie 中提取名为 "name" 的值

    • 注入到方法参数 String name 中

  3. 返回值处理

    • 直接拼接字符串返回

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设置成功";
}

关键点详解

  1. request.getSession()

    • 核心方法,获取当前会话的 HttpSession 对象

    • 重要特性

      • 如果 Session 不存在,会自动创建新 Session

      • 等价于 request.getSession(true)

      • 如果不想自动创建,可使用 request.getSession(false)

  2. setAttribute() 方法

    • 存储数据的标准方式

    • 参数说明:

      void setAttribute(String name, Object value)
    • 可以存储任何可序列化的 Java 对象

    • 相同 name 会覆盖旧值

  3. 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;}
}
  1. request.getSession(false)

    • 参数 false 表示不自动创建新 Session

    • 如果 Session 不存在则返回 null

  2. 安全校验:

    • 显式检查 session == null 处理未登录情况

    • 避免直接操作可能为 null 的 Session

  3. 类型转换:

    • getAttribute() 返回 Object 类型

    • 需要强制转换为目标类型(这里是 String


 方法二:直接注入 HttpSession

@RequestMapping("/r15")
public String getSession2(HttpSession session) {// 直接使用注入的 Session 对象String name = (String) session.getAttribute("name");return "登录用户为: " + name;
}
  1. 自动注入:

    • Spring 会自动注入当前请求的 HttpSession

    • 等价于 request.getSession(true)

  2. 行为特点:

    • 如果 Session 不存在会自动创建新 Session

    • 可能导致不必要的 Session 创建

  3. 空值风险:

    • name 属性可能不存在(返回 null


 方法三:使用 @SessionAttribute 注解

@RequestMapping("/r16")
public String getSession3(@SessionAttribute("name") String name) {return "登录用户为: " + name;
}
  1. 注解特性:

    • 直接从 Session 中提取指定属性

    • 自动完成类型转换(无需显式强转)

  2. 异常处理:

    • 如果属性不存在会抛出 HttpSessionRequiredException

    • 可以使用 required = false 避免

  3. 与 @ModelAttribute 的区别:

    • @SessionAttribute 只从 Session 读取

    • @ModelAttribute 会先检查 Session 再检查请求参数

方法特点适用场景是否自动创建 Session
r14通过 HttpServletRequest 获取需要精确控制 Session 创建可控制 (false)
r15直接注入 HttpSession简单读取场景自动创建 (true)
r16使用 @SessionAttribute 注解需要特定 Session 属性自动创建 (true)

3.小结

今天的分享到这里就结束了,喜欢的小伙伴点点赞点点关注,你的支持就是对我最大的鼓励,大家加油!

http://www.xdnf.cn/news/335431.html

相关文章:

  • PostgreSQL 的 pg_start_backup 函数
  • VR博物馆,足不出户云逛展
  • SpringBoot+Dubbo+Zookeeper实现分布式系统步骤
  • 面向小型企业顶点项目的网络安全咨询人机协作框架
  • 自然语言到 SQL 转换:开启智能数据库交互新时代
  • C++入门小馆 :多态
  • 裸辞8年前端的面试笔记——JavaScript篇(一)
  • uniapp-文件查找失败:‘@dcloudio/uni-ui/lib/uni-icons/uni-icons.vue‘
  • Docker部署常见应用之Superset
  • Linux 网络管理 的实战代码示例
  • C27-简单选择排序法
  • Matlab B级路面激励下集中驱动、轮边驱动和主动减振车辆
  • 人工智能可信度新突破:MIT改进共形分类助力高风险医学诊断
  • 【今日三题】ISBN号码(模拟) / kotori和迷宫(BFS最短路) / 矩阵最长递增路径(dfs)
  • vite 初始化react项目
  • UV使用官网
  • C++GO语言微服务和服务发现
  • mac连接lniux服务器教学笔记
  • c++中的引用
  • C# 方法(输出参数)
  • x64dbg技巧
  • 如何在Vue-Cli中使用Element-UI和Echarts和swiper插件(低版本)
  • 视频编解码学习7之视频编码简介
  • 红黑树详解初版
  • Java数据结构——Queue
  • 使用Deployment部署运行Nginx和Apache服务
  • Java复习笔记-基础
  • Spark缓存--cache方法
  • leetcode 3342. 到达最后一个房间的最少时间 II 中等
  • ​无线手持吸尘器无刷BLDC驱动方案功能介绍---【其利天下】