【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.mzph.cn/news/904905.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

令狐冲的互联网大厂Java面试之旅

场景描绘:互联网大厂Java面试 在某个阳光明媚的上午,令狐冲来到了风清扬所在的互联网大厂,准备迎接他的Java开发工程师面试。风清扬是一位以严谨和深厚技术功底著称的面试官,令狐冲稍显紧张,但他相信自己的准备。 第…

照片to谷歌地球/奥维地图使用指南

软件介绍 照片to谷歌地球/奥维地图是一款由WTSolutions开发的跨平台图片处理工具,能够将带有GPS信息的照片导入Google Earth(谷歌地球)或奥维地图。该软件支持Windows、Mac、iOS、Linux和Android系统,无需下载安装,直…

客户端建立一个连接需要占用客户端的端口吗

客户端建立TCP连接时需占用本地端口,具体机制如下: 一、端口占用的必要性 四元组唯一性‌ TCP连接通过‌源IP、源端口、目标IP、目标端口‌四元组唯一标识。客户端发起连接时,必须绑定本地端口以完成通信标识。 动态端口分配‌ 客户端操作…

【生存技能】ubuntu 24.04 如何pip install

目录 原因解决方案说明 在接手一个新项目需要安装python库时弹出了以下提示: 原因 这个报错是因为在ubuntu中尝试直接使用 pip 安装 Python 包到系统环境中,ubuntu 系统 出于稳定性考虑禁止了这种操作 这里的kali是因为这台机器的用户起名叫kali,我也不知道为什么…

智能时代下,水利安全员证如何引领行业变革?

当 5G、AI、物联网等技术深度融入水利工程,传统安全管理模式正经历颠覆性变革。在这场智能化浪潮中,水利安全员证扮演着怎样的角色?又将如何重塑行业人才需求格局? 水利工程智能化转型对安全管理提出新挑战。无人机巡检、智能监测…

TDengine 在智能制造中的核心价值

简介 智能制造与数据库技术的深度融合,已成为现代工业技术进步的一个重要里程碑。随着信息技术的飞速发展,智能制造已经成为推动工业转型升级的关键动力。在这一进程中,数据库技术扮演着不可或缺的角色,它不仅承载着海量的生产数…

微调ModernBERT为大型语言模型打造高效“过滤器”

ModernBERT(2024 年 12 月)是最近发布的小型语言模型,由 Answer.AI、LightOn 和 HuggingFace 共同开发。它利用了现代优化技术,如用于 8,192 token 上下文窗口的 RoPE 和 GeGLU layers,在保持效率的同时提升性能。jina…

电网拓扑分析:原理与应用

在现代电力系统中,电网拓扑分析是一项至关重要的技术,它为电力系统的安全、稳定和高效运行提供了坚实的基础。电网拓扑描述了电力系统中各元件(如发电机、变压器、输电线路、负荷等)之间的连接关系,通过拓扑分析&#…

OSPF案例

拓扑图: 要求: 1,R5为ISP,其上只能配置IP地址;R4作为企业边界路由器, 出口公网地址需要通过PPP协议获取,并进行chap认证 2,整个OSPF环境IP基于172.16.0.0/16划分;…

2D横板跳跃游戏笔记(查漏补缺ing...)

1.Compression(压缩质量):可以改为None,不压缩的效果最好,但占用内存 2.Filter Mode(过滤模式):可以选择Point(no filter) 3.Pixels Per Unit:是…

MAD-TD: MODEL-AUGMENTED DATA STABILIZES HIGH UPDATE RATIO RL

ICLR 2025 spotlight paper 构建能够在少量样本下学习出优良策略的深度强化学习(RL)智能体一直是一个极具挑战性的任务。为了提高样本效率,近期的研究尝试在每获取一个新样本后执行大量的梯度更新。尽管这种高更新-数据比(UTD&am…

Dia浏览器:AI驱动浏览网页,究竟怎么样?(含注册申请体验流程)

名人说:博观而约取,厚积而薄发。——苏轼《稼说送张琥》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、Dia浏览器简介1. 什么是Dia浏览器2. 开发背景与公司简介3. 与传统浏览器的区别 …

SSL/TLS 证书与数字签名:构建互联网信任的详解

在浩瀚的数字世界中,信任是安全通信的基石。当我们通过浏览器访问一个 HTTPS 网站、进行在线支付,或者下载一个重要的软件更新时,我们如何能确信自己正在与合法的、未被仿冒的对方进行交互?我们又如何能保证传输的数据没有被中途窃…

近日部署跑通的若干多模态模型总结与论文概述

CLIP模型概述与落地测试 CLIP模型全称是Contrastive Language-Image Pretraining​​(对比语言图像预训练)。是OpenAI于2021年提出的多模态预训练模型,通过对比学习对齐图像和文本的表示,实现零样本(zero-shot&#x…

Web3 初学者的第一个实战项目:留言上链 DApp

目录 📌 项目简介:留言上链 DApp(MessageBoard DApp) 🧠 技术栈 🔶 1. Solidity 智能合约代码(MessageBoard.sol) 🔷 2. 前端代码(index.html script.js…

LeetCode 270:在二叉搜索树中寻找最接近的值(Swift 实战解析)

文章目录 摘要描述题解答案题解代码分析示例测试及结果时间复杂度空间复杂度总结 摘要 在日常开发中,我们经常需要在一组有序的数据中快速找到最接近某个目标值的元素。LeetCode 第 270 题“Closest Binary Search Tree Value”正是这样一个问题。本文将深入解析该…

Kotlin高阶函数多态场景条件判断与子逻辑

Kotlin高阶函数多态场景条件判断与子逻辑 fun main() {var somefun: (Int, Float) -> Longval a 4val b 5fsomefun multi()//if 某条件println(somefun.invoke(a, b))//if 某条件somefun add()println(somefun.invoke(a, b)) }fun multi(): (Int, Float) -> Long {re…

嵌入式学习--江协51单片机day4

昨天周五没有学习,因为中午没有睡觉,下午和晚上挤不出整块的时间。周日有考试今天也没有学很多啊,但以后周末会是学一天,另一天休息和写周总结。 今天学了串口通信和LED点阵屏,硬件原理是真的很迷,一但想搞…

Spring Cloud 以Gateway实现限流(自定义返回内容)

前言 Spring Cloud Gateway自带RequestRateLimiterGatewayFilterFactory限流方案,可基于Redis和RedisRateLimiter实现默认算法为令牌桶的请求限流。作为自带的该限流方案,其可与Spring生态的其它各项组件无缝集成,并且自身实现也相对完善/好用…

容器填充函数fill和memset对比总结

文章目录 1、fill() 按元素填充2、memset() 按字节填充3、对比 1、fill() 按元素填充 用于将容器或数组的指定范围内的元素赋值为指定值&#xff08;按元素类型填充&#xff09;。属于 C STL 算法&#xff08;<algorithm> 头文件&#xff09;。 // 从起始地址到结束地址…