欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > 【SpringMVC】详解cookie,session及实战

【SpringMVC】详解cookie,session及实战

2025/5/9 8:00:01 来源:https://blog.csdn.net/2301_81073317/article/details/147616213  浏览:    关键词:【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.小结

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com