SpringBoot集成JWT无状态身份认证的方案详解

 更新时间:2025年11月18日 09:20:53   作者:t***L266  
本文介绍了如何在SpringBoot项目中集成JWT实现无状态身份认证,JWT由Header、Payload和Signature三部分组成,通过添加JJWT依赖,创建JWT工具类和认证拦截器,实现前后端的交互流程,需要注意安全性、性能优化和常见问题,感兴趣的朋友跟随小编一起看看吧

 SpringBoot集成JWT实现无状态身份认证实战

在现代Web应用中,身份认证是必不可少的安全环节。传统的基于Session的认证方式虽然简单易用,但在微服务架构和前端多平台场景下,面临着扩展性差和服务器存储压力大等问题。本文将介绍如何在SpringBoot项目中集成JWT(Json Web Token)实现无状态的身份认证方案。

 一、什么是JWT

JWT是一种开放标准(RFC 7519),定义了一种紧凑且自包含的方式,用于在各方之间安全传输信息作为JSON对象。JWT由三部分组成:

1. **Header**:包含令牌类型和使用的哈希算法

2. **Payload**:存放有效信息的负载部分

3. **Signature**:对前两部分进行签名,防止数据篡改

典型的JWT格式:`xxxxx.yyyyy.zzzzz`

 二、SpringBoot集成JJWT

首先,在pom.xml中添加JJWT依赖:

<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>

创建JWT工具类`JwtUtils.java`:

import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.crypto.SecretKey;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Component
public class JwtUtils {
@Value("${jwt.secret}")
private String secret;
@Value("${jwt.expiration}")
private long expiration;
// 生成token
public String generateToken(String username) {
Map<String, Object> claims = new HashMap<>();
SecretKey key = Keys.hmacShaKeyFor(secret.getBytes());
return Jwts.builder()
.setClaims(claims)
.setSubject(username)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + expiration * 1000))
.signWith(key, SignatureAlgorithm.HS256)
.compact();
}
// 解析token获取用户名
public String getUsernameFromToken(String token) {
SecretKey key = Keys.hmacShaKeyFor(secret.getBytes());
return Jwts.parserBuilder()
.setSigningKey(key)
.build()
.parseClaimsJws(token)
.getBody()
.getSubject();
}
// 验证token是否有效
public boolean validateToken(String token) {
try {
SecretKey key = Keys.hmacShaKeyFor(secret.getBytes());
Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token);
return true;
} catch (Exception e) {
return false;
}
}
}

 三、实现认证拦截器

创建JWT认证拦截器`JwtAuthenticationFilter.java`:

@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {
@Autowired
private JwtUtils jwtUtils;
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain chain)
throws ServletException, IOException {
String token = request.getHeader("Authorization");
// 如果请求头中没有token,直接放行
if (StringUtils.isEmpty(token)) {
chain.doFilter(request, response);
return;
}
// 验证token有效性
if (!jwtUtils.validateToken(token)) {
response.setStatus(HttpStatus.UNAUTHORIZED.value());
response.getWriter().write("无效的Token");
return;
}
// 获取用户名并设置到SecurityContext中
String username = jwtUtils.getUsernameFromToken(token);
UsernamePasswordAuthenticationToken authentication =
new UsernamePasswordAuthenticationToken(username, null, new ArrayList<>());
SecurityContextHolder.getContext().setAuthentication(authentication);
chain.doFilter(request, response);
}
}

配置拦截器注册:

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private JwtAuthenticationFilter jwtAuthenticationFilter;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/auth/**").permitAll()
.anyRequest().authenticated()
.and()
.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
}
}

 四、前后端交互流程

1. **登录流程**:

- 客户端发送用户名密码到`/api/auth/login`

- 服务器验证成功后生成JWT返回给客户端

- 客户端将JWT存储在本地(localStorage或cookie)

2. **后续请求**:

- 客户端在请求头中添加`Authorization: Bearer <JWT>`

- 服务器验证JWT有效性后处理请求

 五、注意事项

1. **安全性**:

- 必须使用HTTPS传输JWT

- 设置较短的过期时间,结合Refresh Token实现自动续期

- JWT一旦发出无法撤回,处理敏感操作应额外验证密码

2. **性能优化**:

- 避免在JWT中存储过多信息

- 可以考虑将部分用户信息缓存在Redis中

3. **常见问题**:

- 密钥泄露问题:定期更换密钥

- CSRF攻击:配合CSRF Token使用

通过本文介绍的方案,我们可以在SpringBoot项目中轻松实现基于JWT的无状态认证。相比传统Session验证,JWT方案更适合现代分布式系统的认证需求,具有诸多优势。

到此这篇关于SpringBoot集成JWT无状态身份认证的文章就介绍到这了,更多相关SpringBoot JWT无状态身份认证内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot controller参数注入方式

    springboot controller参数注入方式

    这篇文章主要介绍了springboot controller参数注入方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Spring扩展接口知识总结

    Spring扩展接口知识总结

    今天带大家学习Java Spring的相关知识,文中对Spring扩展接口作了非常详细的介绍及代码示例,对正在学习java的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • Java 静态数据初始化的示例代码

    Java 静态数据初始化的示例代码

    这篇文章主要介绍了Java 静态数据初始化的示例代码,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-09-09
  • Spring Boot 应用程序启动时执行完整流程(最新推荐)

    Spring Boot 应用程序启动时执行完整流程(最新推荐)

    本文给大家介绍关于Spring Boot应用程序启动时main方法的完整执行流程,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-11-11
  • Spring、SpringMvc和SpringBoot的区别及说明

    Spring、SpringMvc和SpringBoot的区别及说明

    Spring框架提供了全面的Java开发解决方案,核心包括IOC和AOP,SpringMvc作为其中的WEB层开发框架,通过复杂的XML配置管理前端视图和后台逻辑,SpringBoot则简化了配置,专注于微服务接口开发,支持嵌入式服务器,提高了开发效率
    2024-10-10
  • Java资源加载机制及使用最佳实践

    Java资源加载机制及使用最佳实践

    Java类加载器的资源加载机制,包括`getResource`、`getResources`、`findResource`、`findResources`等方法,本文给大家介绍Java资源加载机制及使用最佳实践,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • MyBatis-Plus多表联合查询并且分页(3表联合)

    MyBatis-Plus多表联合查询并且分页(3表联合)

    这篇文章主要介绍了MyBatis-Plus多表联合查询并且分页(3表联合),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • AsyncHttpClient RequestFilter请求筛选源码解读

    AsyncHttpClient RequestFilter请求筛选源码解读

    这篇文章主要为大家介绍了AsyncHttpClient RequestFilter请求筛选源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • ScheduledThreadPoolExecutor巨坑解决

    ScheduledThreadPoolExecutor巨坑解决

    这篇文章主要为大家介绍了使用ScheduledThreadPoolExecutor遇到的巨坑解决示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Java中Swagger生成后端接口测试的详细教程

    Java中Swagger生成后端接口测试的详细教程

    Swagger是一套围绕OpenAPI规范构建的开源工具集,用于设计、构建、文档化和消费RESTful Web服务,供了一种标准化、语言无关的接口来描述REST API,本文给大家介绍了Java中Swagger生成后端接口测试的详细教程,需要的朋友可以参考下
    2025-06-06

最新评论