
springboot
文章平均质量分 75
Java程序员 拥抱ai
我们只是站在ai肩膀上的人
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
别让 @Transactional 再次“失效”!Spring 事务管理的 5 大避坑指南
摘要:本文深入剖析Spring框架中@Transactional注解的工作原理及常见陷阱。该注解通过AOP代理机制实现事务管理,但开发者常因同类方法调用、非public方法、异常捕获、错误异常类型或不当传播行为导致事务失效。文章提出五大致命陷阱及其解决方案,强调应当将注解用于public方法、避免内部调用、正确处理异常,并合理设置只读属性和传播行为。遵循这些最佳实践,开发者才能确保数据一致性和应用可靠性。原创 2025-07-25 08:59:03 · 645 阅读 · 0 评论 -
Redis + MQ:高并发秒杀的技术方案与实现
本文提出了一种基于Redis与消息队列的高并发秒杀系统解决方案。方案采用三级架构:前端通过Redis Lua脚本实现原子性预扣减和防重校验,中间层利用RocketMQ事务消息进行流量削峰,后端完成MySQL库存扣减。系统通过事务消息机制确保Redis与MySQL的数据一致性,并辅以定时对账任务处理异常情况。该方案能有效应对数万级QPS的秒杀场景,解决超卖、重复提交等问题,同时保证系统的高可用性和数据一致性。原创 2025-07-25 08:55:07 · 242 阅读 · 0 评论 -
秒杀系统—1.架构设计和方案简介
《高并发秒杀系统架构设计全解析》 摘要:本文系统性地阐述了高并发秒杀场景下的系统架构设计要点。首先从数据层、页面层、接口层三个维度提出动静分离、CDN加速、动态URL等核心解决方案。其次深入剖析LVS四层负载均衡与Nginx七层负载的协同机制,构建多层次流量控制体系。在关键技术实现上,重点介绍了基于Redis+Lua脚本的库存扣减方案,有效解决超卖问题,同时提出异步下单、MQ削峰等应对高并发的策略。最后,从全链路高可用角度,详细说明了Redis集群崩溃、MQ消息积压等异常场景的容灾处理机制,确保系统稳定性。原创 2025-07-25 08:54:29 · 617 阅读 · 0 评论 -
还在用@Cacheable?你可能只发挥了Spring Boot缓存10%的功力!
本文介绍SpringBoot中8个实用的缓存技巧,帮助开发者优化应用性能。1. 使用@Cacheable注解实现基础缓存;2. 通过@CacheEvict保持缓存新鲜;3. 应用@CachePut更新缓存数据;4. 自定义键生成器实现精细控制;5. 结合内存缓存和分布式缓存构建分层缓存;6. 设置合理的TTL实现自动过期;7. 使用条件化缓存控制缓存内容;8. 通过定时任务或事件机制异步刷新缓存。文章强调缓存策略的重要性,建议开发者根据实际需求灵活运用这些技巧,避免数据过时和系统性能问题。原创 2025-07-21 09:43:42 · 456 阅读 · 0 评论 -
资金账户的缓存一致性保障:如何在高并发下实现零误差?
今天,我们来深入剖析资金账户的缓存一致性保障方案,并结合实际案例给出代码示例,帮助大家在设计系统时轻松应对高并发和强一致性的挑战。通过事务一致性和异步刷新,平台成功处理了每秒 10 万级的转账请求,同时避免了热点问题对系统的影响。通过分布式锁,系统能够在高并发场景下确保账户余额的更新操作是串行化的,避免了超卖或重复扣款问题。你在实际项目中是否参与过资金账户的设计?将高频访问的账户余额存储在 Redis 中,低频访问的账户流水存储在分布式存储中。每次更新账户余额时,先更新数据库,再同步更新缓存,确保一致性。原创 2025-05-07 08:44:08 · 1483 阅读 · 0 评论 -
SpringBoot中6种拦截器使用场景
拦截器是Spring MVC框架提供的一种机制,用于在控制器(Controller)处理请求前后执行特定的逻辑。@Overridetry {@Data@Data@Data@NotBlank(message = "用户名不能为空")@Size(min = 4, max = 20, message = "用户名长度必须在4-20之间")原创 2025-05-07 08:43:15 · 698 阅读 · 0 评论 -
当设计模式遭遇代码熵增:一名Java工程师的架构治理实践
• 代码库会进入自净化状态• 新成员会被现有模式自然同化• 架构治理成本呈指数级下降"整洁不是终点,而是持续抵达终点的过程" —— 共勉。原创 2025-04-30 08:48:48 · 776 阅读 · 0 评论 -
SpringBoot中4种登录验证码实现方案
图形验证码是最传统且应用最广泛的验证码类型,原理是在服务端生成随机字符串并渲染成图片,用户需要识别图片中的字符并输入。图形验证码实现简单,对用户体验影响较小,是中小型应用的理想选择。短信验证码通过向用户手机发送一次性验证码实现身份验证。用户需要输入收到的验证码完成登录过程。这种方式不仅验证了账号密码的正确性,还确认了用户对手机号的控制权,大幅提高了安全性。邮箱验证码通过向用户注册的电子邮箱发送一次性验证码实现身份验证。原创 2025-04-29 11:48:59 · 1491 阅读 · 0 评论 -
Spring Boot 又一强大的内置功能,自动记录API请求/响应数据
传统方案需手动实现请求体缓存、响应流复用等复杂逻辑,而Spring Boot Actuator通过内置的Filter能够轻松的记录请求/响应相关的信息。通过 /actuator/httptrace 端点,Actuator 可记录最近 100 条 HTTP 请求的元数据(如方法、URI、状态码、耗时等),但默认不包含请求体、响应体等敏感数据。实际如果你真使用了来记录HTTP请求/响应日志,那么你完全可以不用上面/ac/httpexchanges接口进行查询,该接口返回的所有数据肯定是不行的。原创 2025-04-29 08:49:42 · 306 阅读 · 0 评论 -
一个注解让 Spring Boot 项目接口返回数据脱敏
当返回对象比较复杂,需要递归去反射,性能一下子就会降低,于是换种思路,我想到平时使用的 @JsonFormat,跟我现在的场景很类似,通过自定义注解跟字段解析器,对字段进行自定义解析,tql。要做成可配置多策略的脱敏操作,要不然一个个接口进行脱敏操作,重复的工作量太多,很显然违背了“多写一行算我输”的程序员规范。思来想去,定义数据脱敏注解和数据脱敏逻辑的接口, 在返回类上,对需要进行脱敏的属性加上,并指定对应的脱敏策略操作。需求是某些接口返回的信息,涉及到敏感数据的必须进行脱敏操作。原创 2025-04-28 08:47:57 · 245 阅读 · 0 评论 -
Spring Boot 实现 IP 限流:原理、实践与利弊分析
在 Spring Boot 中实现 IP 限流是一种简单而有效的方式来保障系统的稳定性和可用性。通过令牌桶算法或漏桶算法,可以对每个 IP 地址的请求频率进行精确控制。虽然 IP 限流存在一些缺点,但在大多数场景下,它仍然是一种不可或缺的限流策略。通过本文的代码案例,你可以快速在自己的 Spring Boot 项目中实现 IP 限流功能。原创 2025-04-28 08:44:45 · 1005 阅读 · 0 评论 -
Spring AOP从入门到实战:原理、用法与应用场景全解析
你是否曾为代码中散落的日志、事务和权限校验逻辑而头疼?是否希望在不修改业务代码的前提下,为系统动态添加统一的功能?原创 2025-04-27 08:44:07 · 861 阅读 · 0 评论 -
Springboot 实现阿里云发送短信
Springboot 实现阿里云发送短信原创 2025-04-25 08:54:34 · 443 阅读 · 0 评论 -
shiro安全认证与SpringBoot集成方式
Shiro通过其易于理解的API,可以快速轻松地保护各种应用程序,包括移动应用程序、Web应用程序和企业应用程序。充当Shiro与应用安全数据间的“桥梁”或“连接器”,自定义Realms需要重写认证和授权两个函数。Shiro内置了一些Realm,支持多种数据源的连接,如JDBC、LDAP、INI文件的连接等。在Spring Boot配置类中配置Shiro的核心组件,包括SecurityManager和Realm。Shiro架构的核心,管理所有用户的安全操作。它充当“保护伞”,引用多个内部嵌套安全组件。原创 2025-04-23 09:40:50 · 263 阅读 · 0 评论 -
在 SpringBoot 项目中如何动态切换数据源、数据库?
前言本文参考若依源码,介绍了如何在SpringBoot项目中使用AOP和自定义注解实现MySQL主从数据库的动态切换,当从库故障时,能自动切换到主库,确保服务的高可用性。如果服务器搭建的是一主多从多个mysql数据源,主服务器用来读。从服务器用来写。此时你在代码层面用注解指定了一个增删改方法到从数据源,但是碰巧此时从数据源失效了,那么就会自动的切换到其它服务器。原创 2025-04-23 08:43:52 · 641 阅读 · 0 评论 -
新特性真香!Spring Boot 3.4 配置属性验证大升级,一文看懂
随着 Spring Boot 3.4 的发布,开发者在配置属性校验方面迎来了更灵活、更强大的能力。相比以往版本的校验方式,3.4 中不仅简化了使用方式,也提升了启动阶段错误发现的粒度和及时性。本文将带你全面了解 Spring Boot 3.4 中的配置属性验证机制,并通过实例掌握其实际应用。什么是配置属性验证?在实际开发中,我们常常会将一些可配置的参数放入或文件中,例如服务名称、线程池大小、是否开启某功能等。使用。原创 2025-04-23 08:41:55 · 419 阅读 · 0 评论 -
【java安全】重要字段脱敏 三种方式 总有一种适合你
字段脱敏是一种常见的需求,尤其是在处理敏感信息(如手机号、身份证号、邮箱等)时。字段脱敏的核心思想是:在数据展示或传输过程中,将敏感字段的部分内容替换为掩码字符(如 `*`),以保护用户隐私。1.使用自定义注解 + AOP 实现字段脱敏。1.2 定义自定义注解。2.定义自定义序列化器。其他自定义序列化器同理。在实体类字段上进行使用。使用hutool工具类。1.1定义切面aop。原创 2025-04-22 08:44:15 · 231 阅读 · 0 评论 -
架构设计过程中的10点体会
所有权也是至关重要的,拥有一个明确的所有者,他们有责任和动力去加强和推动进步。经验数据表明,具有明确责任人的项目成功率比责任模糊的项目高出40%。这里的责任人,不仅定义了他的责任,而明确了他的权力边界。责、权、利明确才是定义所有权。合作很重要,但总有一天你必须做出决定,继续前进,即使没有成功地达成共识。这个时候,在考虑到所提出的所有权衡之后,既定的所有权人应该做出决定,并允许每个人进入实现目标的下一步。过度的讨论和协商可能导致决策瘫痪。数据显示,约23%的项目延期都是由于过度追求共识而延误了决策时机。原创 2025-04-22 08:43:01 · 952 阅读 · 0 评论 -
SpringBoot集成easy-captcha图片验证码框架
Easy-Captcha 通过模块化设计平衡了安全性与开发效率,其源码结构清晰(仅核心类约15个),适合二次开发。无论是快速实现基础验证功能,还是构建企业级人机验证系统,该框架都能提供可靠支持。建议结合具体业务需求,在验证码样式、验证流程上做深度定制。原创 2025-04-18 08:48:47 · 513 阅读 · 0 评论 -
SpringBoot与Geode整合,实现社交平台的用户资料缓存系统
Apache Geode(以前称为 GemFire)是一个开源的、分布式内存数据管理系统,支持大规模、高可用性的数据管理和实时分析,并且结合了内存存储的速度和传统数据库的强大功能。原创 2025-04-16 08:34:01 · 640 阅读 · 0 评论 -
Redis 数据结构大揭秘:String、Hash、List、Set、ZSet 的正确打开方式
某内容推荐平台需要处理用户的异步任务(如生成推荐结果),为了提升效率,使用 Redis 的 List 类型实现任务队列。通过 Redis 的 List 实现异步任务队列,系统能够高效地分发和处理任务,同时避免了任务堆积导致的性能瓶颈。欢迎在评论区分享你的经验!通过 Set 存储用户兴趣标签,系统能够高效地管理和查询用户的兴趣偏好,同时避免了重复标签的问题。通过 Redis 的原子性操作,秒杀活动中的库存扣减能够毫秒级完成,显著提升了系统的吞吐量。:Hash 是一个键值对的集合,适合存储对象的多个字段。原创 2025-04-16 08:32:31 · 1029 阅读 · 0 评论 -
同步 vs 异步性能差10倍!SpringBoot 高吞吐接口实现终极方案
所以,真正使用异步请求的场景应该是该请求的业务代码中,大量的时间CPU是休息的(比如:在业务代码中请求其他系统的接口,在其他系统响应之前,CPU是阻塞等待的),这个时候使用异步请求,就可以释放tomcat的工作线程,让释放的工作线程可以处理其他的请求,从而提高吞吐量。是否有效,只是一个简单的判断,实际中判断有效的并不一定是有效的(比如:客户端取消了请求,服务端是不知道的),但是一般判断为无效的,那肯定是无效了。之后,可以看到之前pending状态的接口完成了响应,得到的结果,就是这里设置的值。转载 2025-04-15 09:11:17 · 374 阅读 · 0 评论 -
哇塞!Spring Boot 一注解逆天,API 超时问题秒解决
开发者无需再为配置 API 超时策略而编写大量复杂代码,只需在目标方法上添加自定义注解(如:@Timeout),即可轻松实现超时时间的灵活设置。这一解决方案不仅简化了开发流程,提高了开发效率,还增强了系统的可维护性与扩展性,为 Spring Boot 应用的稳定运行提供了有力保障。虽然市面上解决接口超时相关的开源组件比较多(如:Resilience4j,非常推荐),但如你不愿引入第三方依赖增加复杂度,且为提升自身技术能力,那么本篇文章非常适合你。接下来,我们将详细剖析该自定义注解的实现原理。原创 2025-04-14 17:41:36 · 550 阅读 · 0 评论 -
美团一面:如何在20秒内完成两个库各100万条数据的快速比对?单机实现从10万都需21秒,到最终优化后100万只需123ms
上周,有个小伙伴参加了美团的面试。面试官给他出了一个很经典的问题:两个数据库各有一百万条数据,如何在20秒内完成数据比对?小伙伴没有答到点子上,面试官不满意,最终面试挂了这个问题看似简单,但实际上却需要高效的算法设计。今天,我们就来详细解析一下这个问题,并给出一些实用的解决方案。接下来我分享一下具体细节。为了实现高效的比对,可以选择HashSet作为主要的数据结构。HashSet的显著特点是利用哈希表实现,保证了元素的唯一性和查询速度。在此场景下,HashSet将提供接近O(1)的查询性能,大大缩短比对时间原创 2025-04-14 17:40:28 · 443 阅读 · 0 评论 -
Spring Cloud 复刻抖音推荐架构!!
我们的推荐系统通过多个服务的协作成功实现了预期功能,但是按照现在的实现,如果其中一个服务挂了,整个推荐系统就不可用了,显然这是我们不期望发生的,所以我们就需要考虑做服务降级,确保即使某个服务出问题,不影响整个系统的使用。这里说明下,我们本次的实例都采用模拟数据的思路,主要是让大家了解下设计思路,所以就不建立相关的库表了。原创 2025-04-14 08:58:37 · 890 阅读 · 0 评论 -
Spring Boot 实现密码安全存储的5种方式
BCrypt是一种基于 Blowfish 加密算法的哈希函数,专为密码存储设计,具有以下特点:• 内置加盐机制,避免彩虹表攻击。• 支持设置计算复杂度,可增强哈希强度。• 哈希结果固定为 60 个字符,方便存储。PBKDF2(Password-Based Key Derivation Function 2)是一种基于密码的密钥派生函数,支持多次迭代计算,进一步增强安全性。Argon2是一种密码哈希算法,2015 年获得密码哈希竞赛(Password Hashing Competition)冠军。原创 2025-04-14 08:55:32 · 658 阅读 · 0 评论 -
太强了!SpringBoot 3 接口防刷的 8 种高效解决方案,你用对了吗
方案优点缺点适用场景Nginx限流性能高,防护前置粒度粗,用户维度不可控静态资源、统一入口Redis+注解限流灵活,适配复杂场景侵入代码,复杂度高登录/操作类接口Guava限流轻量无依赖单机不可集群共享单体系统限流Sentinel限流支持控制台、维度丰富需额外部署 Sentinel 控制台微服务系统图形验证码防止脚本攻击用户体验一般注册/登录滑块验证码智能行为识别接入复杂,成本高高安全场景IP白名单简洁、安全无法动态扩展内部系统/回调接口。原创 2025-04-14 08:53:45 · 779 阅读 · 0 评论 -
Spring Boot 3 实现 SSO 单点登录的多种解决方案
登录成功后,认证中心签发 JWT(JSON Web Token);子系统间共享公钥进行验证,避免中心化管理,系统无状态化。原创 2025-04-11 09:48:14 · 1446 阅读 · 0 评论 -
SpringBoot与Calcite整合,实现多数据源统一查询系统
/ 定义Calcite模型JSON字符串" {\n" +" }\n" +" }\n" +" ]\n" +"}";// 创建Calcite连接// 获取根模式并添加子模式@Override// 返回表映射,这里不需要额外处理。原创 2025-04-11 09:47:38 · 1131 阅读 · 0 评论 -
RabbitMQ 与 RocketMQ 的消息堆积解决方案
今天,我们来深入探讨 RabbitMQ 和 RocketMQ 在消息堆积场景下的解决方案,并结合实际案例分析如何高效应对这一挑战。无论是 RabbitMQ 还是 RocketMQ,合理的设计和优化都能有效解决消息堆积问题,保障系统的稳定性和高可用性。RabbitMQ 提供了多种机制来应对消息堆积问题,包括消息分片、消费者扩容和死信队列等。对于无法消费的消息,可以配置死信队列(DLX),将失败消息存储到单独的队列中进行后续处理。RocketMQ 支持批量消费,允许消费者一次拉取多条消息,从而提升消费效率。原创 2025-04-10 13:36:03 · 680 阅读 · 0 评论 -
SpringBoot 接口防重复提交
凭证存储决策,两种方式实现:redis、caffine。如果是集群部署,建议用 redis,如果是单体部署,建议用内存 caffine。很多时候需要限制用户的并发请求次数,比如对于某个接口,不能请求太频繁,限制 一个用户每秒钟只能请求一次;因为是使用注解来解决问题,所以离不开 AOP,这里使用。• 短信验证码,对于同一个用户,60 秒才能请求一次;使用 caffine 作为存储,具体凭证使用的是。,我这里用 sa-token 鉴权的,可自行修改。• 登录,对于一个用户,10 秒才能请求一次。原创 2025-04-10 13:34:33 · 274 阅读 · 0 评论 -
Spring Integration 轻松实现服务间消息传递,真香!
定义消息通道:在 Spring Integration 中,消息通道是消息在系统中传递的关键“管道”。我们可以使用 XML 配置或者 Java 代码来定义消息通道。XML 配置示例Java 配置示例@Bean配置消息通道的类型:Spring Integration 提供了多种不同类型的消息通道,如直接通道(Direct Channel)、发布 - 订阅通道(Publish - Subscribe Channel)、队列通道(Queue Channel)等。我们可以根据实际需求选择合适的通道类型。原创 2025-04-10 13:33:33 · 825 阅读 · 0 评论 -
再也不用等!Spring Boot 3.3 搞定大文件分块上传 + 文件“秒传”,速度飞起!
结合前后端完整示例,本文将带你从零构建一套实用的上传方案,助力各类业务系统高效接入大文件处理能力。: 基于 Bootstrap + SparkMD5 + Axios 实现分块上传与秒传功能。的特性,适用于企业级系统中的文档上传、视频管理、素材收集等场景。:可进一步结合 Redis、MQ 等组件提升并发处理能力。在现代化的文件上传场景中,用户往往会面临上传。✅ 分块上传(支持大文件断点续传)✅ 分块合并(支持服务端合并)通过本文,我们构建了一个完整的。:支持大文件,提升上传稳定性。:避免重复上传,节省资源。原创 2025-04-10 13:28:52 · 172 阅读 · 0 评论 -
SpringBoot集成weixin-java-mp实现公众号扫码登录
不同于常见的OAuth2.0授权登录方式,本文介绍的是通过微信公众号的消息回调机制实现的扫码登录流程。其核心逻辑是:用户扫描网站上的临时二维码,公众号接收到关注或扫码事件后,通过预先配置的回调接口将用户信息传递给网站服务器,从而完成身份验证和登录过程。本文详细介绍了如何通过SpringBoot集成weixin-java-mp实现微信公众号扫码登录功能。与传统的OAuth2.0授权方式不同,这种实现方式通过微信公众号的消息回调机制,实现了更灵活的扫码登录流程。原创 2025-04-09 10:31:28 · 1069 阅读 · 0 评论 -
Java实现生产者-消息者模式的多种实现
使用两个Condition分别控制"非满"和"非空"状态,比Object的单一等待集更高效。生产者-消费者模式是并发编程的基础,掌握它的多种实现方式能让你在面对不同场景时游刃有余。,这样既平衡了两者的处理能力差异,又避免了直接依赖。Lock接口提供了更灵活的加锁机制(可中断、超时等)代码极其简洁,JDK已经帮我们处理了所有线程同步细节。方法本身就是阻塞的,完美匹配生产者-消费者场景。二、基础实现:wait()/notify()代码结构更清晰,锁的获取和释放显式控制。一、什么是生产者-消费者模式?原创 2025-04-09 08:50:58 · 389 阅读 · 0 评论 -
别懵圈啦!Spring Boot 这 8 个基础开发技能,你 get 到了没?
集成 Resilience4j 实现断路器(熔断器)功能。1. 使用 Resilience4j 保护服务。环境:SpringBoot3.4.2。针对上面的熔断器userList配置。2. 自定义Endpoint监控应用。有关异步编程更多内容,请查看下面链接。支持 WebSocket 和负载均衡。原创 2025-04-09 08:49:45 · 245 阅读 · 0 评论 -
太强了!Spring Boot 3.4 的 @JsonView 注解,让接口返回灵活到飞起!
但不同行为场景下,前端所需的数据范围是不同的。举个例子,产品列表只需要展示商品的基本信息,如商品名、价格等;注解的支持,它就像一个灵活的“数据可见性开关”——可以帮我们按需返回不同的数据字段,既保持了数据结构统一,又能减轻维护负担。传统做法是定义多个 DTO 分别应对不同的展示需求,但这样做容易产生大量重复代码,维护起来也会相当头疼。,你可以优雅地应对各种接口返回需求,真正实现“灵活到飞起”的数据控制!🚀 不同接口就像不同“窗口”,只展示自己该展示的数据。像上面的代码,如果 JSON 中包含。原创 2025-04-09 08:48:00 · 228 阅读 · 0 评论 -
nginx中设置IP白名单/黑名单
如以下配置中:172.17.0.8不能访问,172.17.0.0/16网络中的其它地址都能访问。nginx中ngx_http_access_module模块能够按客户端地址设置是否有访问权限。如何检查规则是否匹配:请求的客户端的IP与allow或deny指令后的IP/网络是否匹配。修改以上配置,将第一、二条规则交换顺序后,172.17.0.8可以访问。指令,按先后顺序逐条匹配,第一个匹配成功的规则立即生效不会再检查后面的规则。指令设置允许访问的IP或网络,如。指令设置限制访问的IP或网络,如。原创 2025-04-09 08:46:58 · 325 阅读 · 0 评论 -
缓存的应用场景:加速数据访问、降低后端负载的实战秘籍!
通过将热点数据存储在内存中,减少对后端数据库的直接访问,从而大幅降低响应时间。对于高频访问的静态页面或动态生成的 HTML 内容,可以通过缓存减少渲染开销。通过合理的缓存设计,我们可以显著提升系统的性能和稳定性,同时降低运维成本。缓存可以拦截大部分读请求,减轻数据库的压力,提升系统的整体吞吐量。在分布式系统中,用户的会话信息可以通过缓存实现共享,避免单点故障。在后端服务不可用时,缓存可以作为降级方案,保障核心功能的可用性。:当缓存失效时,优先返回默认值,避免直接访问数据库。原创 2025-04-09 08:46:17 · 514 阅读 · 0 评论 -
JWT 实现登录认证 + Token 自动续期方案,这才是正确的使用姿势!
更新用户密码时需要重新生成新的token,并将新的token返回给前端,由前端更新保存在local storage中的token,同时更新存储在redis中的token,这样实现可以避免用户重新登陆,用户体验感不至于太差。在实际项目中,用户分为普通用户和管理员用户,只有管理员用户拥有删除用户的权限,这一块功能也是涉及token操作的,但是我太懒了,demo工程就不写了。基于session和基于JWT的方式的主要区别就是用户的状态保存的位置,session是保存在服务端的,而JWT是保存在客户端的。原创 2025-04-08 19:36:21 · 534 阅读 · 0 评论