Spring Boot整合JWT 实现双Token机制

目录

  1. JWT核心概念解析
  2. Spring Boot整合步骤
    • 2.1 基础环境搭建
    • 2.2 Token生成与解析
    • 2.3 拦截器实现
  3. 企业级增强方案
    • 3.1 双Token刷新机制
    • 3.2 安全防护策略
  4. 常见问题与解决方案

1. JWT核心概念解析

1.1 Token的三重使命

  • 身份凭证:替代Session实现无状态认证
  • 信息载体:存储用户基础信息(如userid、roles)
  • 安全屏障:数字签名防止数据篡改

1.2 JWT结构示例

Header
{"alg": "HS256","typ": "JWT"
}Payload
{"sub": "123456","name": "John","iat": 1516239022
}Signature
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

2. Spring Boot整合步骤

2.1 基础环境搭建

依赖配置

<!-- pom.xml -->
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version>
</dependency>

配置文件

# application.yml
jwt:secret: your-256-bit-encryption-keyexpiration: 7200 # 2小时header: Authorization

2.2 Token生成与解析

工具类实现

@Component
public class JwtUtils {// 注入配置参数@Value("${jwt.secret}")private String secret;// 生成Tokenpublic String generateToken(UserDetails user) {return Jwts.builder().setSubject(user.getUsername()).claim("roles", user.getAuthorities()).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() + expiration * 1000)).signWith(SignatureAlgorithm.HS256, secret).compact();}// 解析Tokenpublic Claims parseToken(String token) {return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();}
}

2.3 拦截器实现

认证拦截器

public class JwtInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {// 1. 检查白名单路径if (isWhiteList(request.getRequestURI())) {return true;}// 2. 获取并验证TokenString token = request.getHeader(jwtProperties.getHeader());if (!jwtUtils.validateToken(token)) {throw new UnauthorizedException("无效的访问凭证");}// 3. 注入用户信息Claims claims = jwtUtils.parseToken(token);request.setAttribute("userId", claims.getSubject());return true;}private boolean isWhiteList(String uri) {return Arrays.asList("/api/login", "/api/refresh").contains(uri);}
}

注册拦截器

@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(jwtInterceptor()).addPathPatterns("/api/**").excludePathPatterns("/api/auth/**");}
}

3. 企业级增强方案

3.1 双Token刷新机制

流程图解

Client Server 登录请求(账号+密码) AccessToken(2h)+RefreshToken(7d) 携带AccessToken请求 返回业务数据 loop [正常访问] 携带RefreshToken请求刷新 返回新AccessToken 重新登录 alt [AccessToken过期] [RefreshToken过期] Client Server

刷新接口实现

@PostMapping("/refresh")
public Result refreshToken(@RequestParam String refreshToken) {if (redisTemplate.hasKey(refreshToken)) {String username = redisTemplate.opsForValue().get(refreshToken);UserDetails user = userService.loadUserByUsername(username);String newAccessToken = jwtUtils.generateToken(user);return Result.ok().data("accessToken", newAccessToken);}throw new BusinessException(600, "刷新令牌已失效");
}

3.2 安全防护策略

五层防御体系

  1. 传输加密:强制使用HTTPS
  2. 存储安全:前端使用HttpOnly Cookie
  3. 自动续期:Access Token有效期≤2小时
  4. 黑名单:登出Token立即失效
  5. 限流控制:接口请求频率限制

黑名单实现

@Component
public class TokenBlacklist {@Autowiredprivate RedisTemplate<String, String> redisTemplate;// Token加入黑名单(有效期剩余时间)public void addToBlacklist(String token) {Date expiration = jwtUtils.getExpirationFromToken(token);long ttl = expiration.getTime() - System.currentTimeMillis();redisTemplate.opsForValue().set(token, "invalid", ttl, TimeUnit.MILLISECONDS);}
}

4. 常见问题与解决方案

问题现象根本原因解决方案
签名验证失败密钥不一致或Token被篡改统一密钥管理(配置中心)
Token突然失效服务器时间不同步部署NTP时间同步服务
高并发下认证超时RSA算法性能瓶颈切换为HS256算法
无法强制下线已登录用户无状态特性导致结合Redis维护短期Token黑名单

总结:JWT为现代分布式系统提供了优雅的认证解决方案,但实际落地时需综合考虑安全、性能、用户体验等多维度因素。建议结合具体业务场景选择合适的Token管理策略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/36142.html

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

相关文章

RCore学习记录002

初次运行RCore和调试&#xff0c;这里使用的RCore代码是实验指导书的代码&#xff0c;而非RCore训练营的 讲两种方法&#xff0c;第一种是传统的gdb调试&#xff0c;在上一节中提到的riscv交叉编译工具链中的已经安装了riscv的gdb&#xff0c;另一种是基于CLion的可视化调试&a…

maven在idea上搭建

maven搭建 首先进入maven官网&#xff0c;去download下载欢迎使用 Apache Maven – Maven下载免安装版本&#xff0c;解压在任意目录下&#xff0c;命名别取中文名 配置环境变量 复制你刚刚maven解压的路径&#xff0c;我这里是D:\resource\apache-maven-3.8.8&#xff0c;之…

【sql靶场】第18-22关-htpp头部注入保姆级教程

目录 【sql靶场】第18-22关-htpp头部注入保姆级教程 1.回顾知识 1.http头部 2.报错注入 2.第十八关 1.尝试 2.爆出数据库名 3.爆出表名 4.爆出字段 5.爆出账号密码 3.第十九关 4.第二十关 5.第二十一关 6.第二十二关 【sql靶场】第18-22关-htpp头部注入保姆级教程…

K8S下nodelocaldns crash问题导致域名请求响应缓慢

前言 最近做项目&#xff0c;有业务出现偶发的部署导致响应很慢的情况&#xff0c;据了解&#xff0c;业务使用域名访问&#xff0c;相同的nginx代理&#xff0c;唯一的区别就是K8S重新部署了。那么问题大概率出现在容器平台&#xff0c;毕竟业务是重启几次正常&#xff0c;偶…

SpringBoot之如何集成SpringDoc最详细文档

文章目录 一、概念解释1、OpenAPI2、Swagger3、Springfox4、Springdoc5. 关系与区别 二、SpringDoc基本使用1、导包2、正常编写代码&#xff0c;不需要任何注解3、运行后访问下面的链接即可 三、SpringDoc进阶使用1、配置文档信息2、配置文档分组3、springdoc的配置参数**1. 基…

基于扣子(coze.cn)搭建一个古文化学习助手

highlight: a11y-dark 扣子Coze 是由字节跳动推出的一个AI聊天机器人和应用程序编辑开发平台&#xff0c;可以理解为字节跳动版的GPTs。 下面进行Coze的登录&#xff0c;初步使用&#xff0c;创建定制化的Bot&#xff08;聊天机器人&#xff09;&#xff0c;插件使用等操作。…

Modbus TCP到RTU:轻松转换指南!

Modbus TCP 到 RTU&#xff1a;轻松转换指南&#xff01; 在现代工业自动化领域&#xff0c;Modbus TCP和Modbus RTU两种通信协议因其高效、稳定的特点被广泛应用。然而&#xff0c;随着技术的发展和设备升级的需求&#xff0c;经常会遇到需要将这两种协议进行互相转换的场景。…

云钥科技工业相机定制服务,助力企业实现智能智造

在工业自动化、智能制造和机器视觉快速发展的今天&#xff0c;工业相机作为核心感知设备&#xff0c;其性能直接决定了检测精度、生产效率和产品质量。然而&#xff0c;标准化工业相机往往难以满足复杂多样的应用场景需求&#xff0c;‌工业相机定制‌逐渐成为企业突破技术瓶颈…

HAL库STM32常用外设—— CAN通信(一)

文章目录 一、CAN是什么&#xff1f;1.1 CAN应用场景1.2 CAN通信优势 二、CAN基础知识介绍2.1 CAN总线结构2.2 CAN总线特点2.2.1 CAN总线的数据传输特点2.2.2 位时序和波特率 2.3 CAN位时序和波特率2.3 CAN物理层2.3.1 CAN 物理层特性2.3.2 CAN 收发器芯片介绍 2.4 CAN协议层2.…

设计模式 二、创建型设计模式

GoF是 “Gang of Four”&#xff08;四人帮&#xff09;的简称&#xff0c;它们是指4位著名的计算机科学家&#xff1a;Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides。他们合作编写了一本非常著名的关于设计模式的书籍《Design Patterns: Elements of Reusable…

微软远程桌面即将下架?Splashtop:更稳、更快、更安全的 RDP 替代方案

近日&#xff0c;Windows 官方博客宣布&#xff1a;将于2025年5月27日起&#xff0c;在 Windows 10 和 Windows 11 应用商店中下架“Microsoft 远程桌面”应用&#xff0c;建议用户迁移至新的 Windows App。这一变动引发了广大用户对远程访问解决方案的关注。作为全球领先的远程…

黑马跟学.苍穹外卖.Day08

黑马跟学.苍穹外卖.Day08 苍穹外卖-day8课程内容1. 工作台1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计 1.2 代码导入1.2.1 Controller层1.2.2 Service层接口1.2.3 Service层实现类1.2.4 Mapper层 1.3 功能测试1.3.1 接口文档测试1.3.2 前后端联调测试 1.4 代码提交 2. Ap…

技术路线图ppt模板_流程图ppt图表_PPT架构图

技术路线图ppt模板 / 学术ppt模板 - 院士增选、国家科技奖、杰青、长江学者特聘教授、校企联聘教授、重点研发、优青、青长、青拔.. / 学术ppt案例 WordinPPT / 持续为双一流高校、科研院所、企业等提供PPT制作系统服务。 - 科学技术奖ppt&#xff1a;自然科学奖 | 技术…

差分专题练习 ——基于罗勇军老师的《蓝桥杯算法入门C/C++》

一、1.重新排序 - 蓝桥云课 算法代码&#xff1a; #include <bits/stdc.h> using namespace std; const int N 1e5 3;int a[N], d[N], cnt[N];int main() {int n; scanf("%d", &n);for (int i 1; i < n; i) scanf("%d", &a[i]);int m…

【蓝桥杯】每天一题,理解逻辑(4/90)【Leetcode 二进制求和】

题目描述 我们解析一下题目 我们可以理解到两个主要信息 给的是二进制的字符串返回他们的和 我们知道&#xff0c;十进制的加减法需要进位&#xff0c;例如&#xff1a;9716是因为91之后进了一位&#xff0c;二进制也是如此&#xff0c;只不过十进制是逢10进1&#xff0c;二…

.NET 9 中 OpenAPI 替代 Swagger 文档生成

微软已经放弃了对 .NET 9 中 Swagger UI 包 Swashbuckle 的支持。他们声称该项目“不再由社区所有者积极维护”并且“问题尚未得到解决”。 这意味着当您使用 .NET 9 模板创建 Web API 时&#xff0c;您将不再拥有 UI 来测试您的 API 端点。 我们将调查是否可以在 .NET 9 中使用…

MySQL -- 复合查询

数据库的查询是数据库使用中比较重要的环节&#xff0c;前面的基础查询比较简单&#xff0c;不做介绍&#xff0c;可自行查阅。本文主要介绍复合查询&#xff0c;并结合用例进行讲解。 本文的用例依据Soctt模式的经典测试表&#xff0c;可以自行下载&#xff0c;也可以自己创建…

蓝桥杯第13届真题2

由硬件框图可以知道我们要配置LED 和按键 一.LED 先配置LED的八个引脚为GPIO_OutPut&#xff0c;锁存器PD2也是&#xff0c;然后都设置为起始高电平&#xff0c;生成代码时还要去解决引脚冲突问题 二.按键 按键配置&#xff0c;由原理图按键所对引脚要GPIO_Input 生成代码&a…

Linux的Shell编程

一、什么是Shell 1、为什么要学习Shell Linux运维工程师在进行服务器集群管理时&#xff0c;需要编写Shell程序来进行服务器管理。 对于JavaEE和Python程序员来说&#xff0c;工作的需要。Boss会要求你编写一些Shell脚本进行程序或者是服务器的维护&#xff0c;比如编写一个…

PDFMathTranslate 安装、使用及接入deepseek

PDFMathTranslate 安装、使用及接入deepseek 介绍安装及使用接入deepseek注意 介绍 PDFMathTranslate 是非常好用的科学 PDF 文档翻译及双语对照工具&#xff0c;可以将论文按照其原本的排版结构执行多种语言翻译&#xff0c;并且可以接入如&#xff1a;谷歌翻译、deepl、deep…