JWT在SpringBoot3中的作用及说明

 更新时间:2025年12月24日 09:47:11   作者:wh_xia_jun  
JWT是一种开放标准(RFC 7519),用于在网络应用环境间安全地将信息作为JSON对象传输,JWT在SpringBoot中用于身份验证、授权和无状态性,相比传统的session/cookie方式,JWT具有无状态、易于扩展、跨域支持好、性能高等优点,但也存在令牌体积较大

一、JWT 是什么?(生活类比)

JWT 就像是一个 "电子身份证" 或者 "入场手环"。想象一下:

去游乐园玩

  • 你在入口处买票后,工作人员给你一个 彩色手环
  • 这个手环上印着你的名字、入园时间、有效期
  • 手环是防水的,很难伪造
  • 你进入园内后,所有游乐设施都通过这个手环确认你的身份和权限
  • 你不需要每次都出示门票,也不需要重新排队验证身份

参加会议

  • 你注册会议后,收到一个 电子胸牌
  • 胸牌上有你的照片、姓名、公司、会议场次权限
  • 这个胸牌是加密的,别人无法复制
  • 你可以自由进入任何允许的会议室,保安只需要扫描胸牌就能验证

二、JWT 在 Spring Boot 中的具体作用

身份验证(登录后)

  • 用户登录后,服务器生成一个 JWT 令牌
  • 这个令牌包含用户的基本信息(用户名、ID、角色等)
  • 客户端(浏览器 / 手机)保存这个令牌
  • 后续每次请求都带上这个令牌,就像你戴着游乐园手环一样

授权(权限控制)

  • JWT 令牌中可以包含用户的角色信息(如管理员、普通用户)
  • 服务器收到请求后,检查令牌中的角色信息
  • 决定用户是否有权限访问特定资源(比如只有管理员能删除数据)

无状态性(最重要的特点)

  • 服务器不需要存储令牌信息(不像传统的 session 方式)
  • 就像游乐园的手环,工作人员不需要查电脑,直接看手环就能验证
  • 这使得系统更容易扩展到多个服务器(微服务架构)

三、为什么要用 JWT?(对比传统方式)

传统的 session/cookie 方式

  • 你去超市办了一张会员卡
  • 每次消费都要刷卡,店员要查数据库确认你的身份
  • 如果超市开了很多分店,数据同步会很麻烦
  • 如果会员卡丢了,别人可能冒用你的身份

JWT 方式

  • 你在银行办了一张电子支票
  • 支票上有你的信息、金额、有效期,而且是加密的
  • 任何银行都可以直接验证支票的真实性,不需要联网查数据库
  • 即使支票被别人捡到,没有密钥也无法修改信息

四、Spring Boot 3 中 JWT 的工作流程

用户登录

  • 用户提供用户名和密码
  • Spring Boot 验证后,生成一个 JWT 令牌

客户端保存

  • 浏览器把令牌保存在 localStorage 或 cookie 中
  • 移动应用把令牌保存在应用内存储中

请求资源

  • 客户端在每个请求的 Header 中添加 Authorization: Bearer <token>
  • 就像你去餐厅吃饭,进门时出示你的会员卡

服务器验证

  • Spring Boot 检查令牌的签名和有效期
  • 提取用户信息,确定访问权限
  • 处理请求并返回结果

五、JWT 的优缺点

优点

  • 无状态,易于扩展(适合微服务)
  • 跨域支持好(不需要担心 cookie 跨域问题)
  • 性能高(不需要频繁查询数据库)
  • 可以在令牌中包含自定义信息

缺点

  • 令牌体积较大(相比简单的 session ID)
  • 一旦签发,很难立即撤销(除非实现黑名单机制)
  • 令牌过期后,用户需要重新登录

六、生活中的 JWT 例子总结

  • 登机牌:包含你的姓名、航班号、座位号、登机口,全球机场通用
  • 酒店房卡:包含你的姓名、房间号、有效期,所有酒店员工都能验证
  • 电子优惠券:包含优惠金额、有效期、使用条件,商家扫码就能验证

JWT 的核心思想就是:一次验证,到处通行,而且验证过程简单高效。这就是为什么它在现代 Web 应用中如此受欢迎。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Springboot中的@ConditionalOnBean注解详细解读

    Springboot中的@ConditionalOnBean注解详细解读

    这篇文章主要介绍了Springboot中的@ConditionalOnBean注解详细解读,@ConditionalOnMissingBean注解两个类,一个Computer类,一个配置类,想要完成;如果容器中没有Computer类,就注入备用电脑Computer类,如果有Computer就不注入,需要的朋友可以参考下
    2023-11-11
  • 使用Servlet处理一个上传的文件

    使用Servlet处理一个上传的文件

    今天小编就为大家分享一篇关于使用Servlet处理一个上传的文件,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Java(基于Struts2) 分页实现代码

    Java(基于Struts2) 分页实现代码

    这篇文章介绍了Java(基于Struts2) 分页实现代码,有需要的朋友可以参考一下
    2013-10-10
  • springboot+kafka中@KafkaListener动态指定多个topic问题

    springboot+kafka中@KafkaListener动态指定多个topic问题

    这篇文章主要介绍了springboot+kafka中@KafkaListener动态指定多个topic问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Maven版本冲突的原因分析和解决指南

    Maven版本冲突的原因分析和解决指南

    我们可能会因为Maven功能变更、性能提升、修复漏洞等多种原因,去更换第三方库或框架,此时就容易发生版本冲突,本期我们就介绍一下相关知识,以及如何解决版本冲突方法,需要的朋友可以参考下
    2025-11-11
  • Java中finally释放的是什么资源

    Java中finally释放的是什么资源

    本文详细解释了finally块的作用及常见的需要释放的资源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-11-11
  • Java优雅的处理 null的方法和使用

    Java优雅的处理 null的方法和使用

    本文主要介绍了Java使用Optional优雅的处理null值,通过Optional替代繁杂的if判空处理逻辑,具有一定的参考价值,感兴趣的可以了解一下
    2025-08-08
  • Java版微信公众号支付开发全过程

    Java版微信公众号支付开发全过程

    这篇文章主要介绍了Java版微信公众号支付开发全过程,本文通过实例相结合给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07
  • Spring DevTools的介绍

    Spring DevTools的介绍

    今天小编就为大家分享一篇关于Spring DevTools的介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Java中的

    Java中的"goto"语句妙用

    这篇文章主要介绍了Java中的"goto"语句妙用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论