【SpringBoot】44、SpringBoot中整合JWT实现Token验证(整合篇)

本文介绍了JWT在网络应用中的作用,以及为什么在前后端分离项目中需要使用JWT代替session。详细阐述了JWT的应用场景,如单点登录。接着,文章展示了在SpringBoot中整合JWT的具体步骤,包括创建和验证JWT token,以及如何从token中获取用户信息。最后提供了相关工具类的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是JWT?

Json web token (JWT),是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准((RFC 7519),该 token 被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT 的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

为什么需要JWT?

当我们开发前后端分离项目时,要求我们对用户会话状态要进行一个无状态处理,那我们知道普通的web项目用于管理用户会话的往往是 session,用户每次用服务器认证成功后,服务器都会发送一个 sessionid 给用户,session 是保存在服务端的,服务器通过 session 分辨用户,进行权限认证等一系列操作。每次请求完后,都会在 响应头中返回 sessionid 给浏览器,浏览器会将 sessionid 存储在 cookie 中,以后的每次请求都会在请求头中带上这个 sessionid 信息,服务器就会根据这个 sessionid 作为索引获取到具体的 session。

那上面讲述的场景就会出现一个痛点,当我们前后端分离后,我们的前端项目和后端项目

### 实现Sa-Token登录状态保持功能 为了实现Sa-Token的登录状态保持功能,主要依赖于`sa-token`模块中的配置项以及相应的API接口。通过合理设置这些参数可以确保用户的登录状态得以持久化。 #### 配置文件调整 在应用的配置文件中定义了多个关于Token行为的关键属性[^1]: - `timeout`: 设置全局token的有效期限,默认为30天(86400秒)。如果希望延长这个时间来支持长时间有效的会话,则可适当增加此数值。 ```yaml sa-token: timeout: 2592000 # 将默认值改为一个月(约30*24*3600=2592000秒) ``` - `is-concurrent`: 控制是否允许多设备/浏览器同时在线访问同一个账户。当设为`true`时,不同客户端能够并行使用相同的账号而不会互相影响;反之则新的登录将会使之前的session失效。 ```yaml sa-token: is-concurrent: true # 启用多端并发登录能力 ``` - `activity-timeout`: 定义了一个基于活动的时间窗口,在这段时间内如果没有用户交互就会认为该Session已经结束。对于需要更灵活管理活跃度的应用来说非常有用。这里将其设定为永久有效(-1),意味着只要不主动登出就不会自动退出。 ```yaml sa-token: activity-timeout: -1 # 取消因缺乏互动而导致的超时机制 ``` #### 编写控制器逻辑 下面是一个简单的Spring Boot项目下的Java代码片段用于处理用户认证请求,并利用上述配置完成持续性的身份验证过程: ```java import cn.dev33.satoken.stp.StpUtil; // 导入其他必要的包... @RestController @RequestMapping("/auth") public class AuthController { @PostMapping("/login") public ResponseEntity<String> login(@RequestParam String username, @RequestParam String password){ // 进行业务校验... StpUtil.login(username); // 使用用户名作为标识符创建一个新的会话 return new ResponseEntity<>("Login Success", HttpStatus.OK); } @GetMapping("/info") public Map<String,Object> info(){ HashMap<String, Object> data = Maps.newHashMap(); data.put("id",StpUtil.getLoginId()); // 获取当前登录者的唯一ID data.put("username", StpUtil.getLoginIdByToken()); return data; } } ``` 这段程序展示了如何接收来自前端的身份凭证(`username`, `password`)并通过调用`StpUtil.login()`方法建立关联关系。一旦成功登陆之后,任何携带合法Token的HTTP请求都能顺利获取到受保护资源的信息。
评论 522
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Asurplus

学如逆水行舟,不进则退

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值