当前位置:首页 > Java资讯 > 正文内容

Spring Boot整合JWT:实现安全高效的API认证之旅

admin2周前 (07-23)Java资讯7

Spring Boot整合JWT:实现安全高效的API认证之旅

一、引言

随着互联网的快速发展,API已经成为企业服务的重要方式。为了确保API的安全性,我们通常会采用JWT(JSON Web Token)技术进行身份认证。本文将深入探讨如何将Spring Boot与JWT技术相结合,实现安全高效的API认证。

二、JWT简介

JWT是一种开放标准(RFC 7519),用于在各方之间安全地传输信息。它将认证信息加密后,以JSON格式存储在一段字符串中。JWT具有以下特点:

1. 自包含:JWT包含了所有认证信息,无需额外的数据库或缓存支持。

2. 无需服务器存储:JWT可以在客户端存储,降低服务器压力。

3. 无需轮询:JWT的过期时间可以自定义,无需不断轮询服务器获取新令牌。

三、Spring Boot整合JWT

1. 添加依赖

在Spring Boot项目中,我们需要添加以下依赖:

```xml

io.jsonwebtoken

jjwt

0.9.1

```

2. 创建JWT工具类

```java

import io.jsonwebtoken.Claims;

import io.jsonwebtoken.Jwts;

import io.jsonwebtoken.SignatureAlgorithm;

import org.springframework.stereotype.Component;

import java.util.Date;

@Component

public class JwtUtil {

private static final String SECRET_KEY = "your_secret_key"; // 密钥

public String generateToken(String username) {

return Jwts.builder()

.setSubject(username)

.setIssuedAt(new Date(System.currentTimeMillis()))

.setExpiration(new Date(System.currentTimeMillis() + 60 * 60 * 1000)) // 1小时后过期

.signWith(SignatureAlgorithm.HS256, SECRET_KEY)

.compact();

}

public Claims parseToken(String token) {

return Jwts.parser()

.setSigningKey(SECRET_KEY)

.parseClaimsJws(token)

.getBody();

}

}

```

3. 创建认证控制器

```java

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.PostMapping;

import org.springframework.web.bind.annotation.RequestBody;

import org.springframework.web.bind.annotation.RestController;

@RestController

public class AuthController {

@Autowired

private JwtUtil jwtUtil;

@PostMapping("/login")

public String login(@RequestBody LoginRequest loginRequest) {

// 验证用户名和密码,此处省略具体实现

if (loginRequest.getUsername().equals("admin") && loginRequest.getPassword().equals("123456")) {

return jwtUtil.generateToken(loginRequest.getUsername());

}

return "认证失败";

}

}

```

4. 创建过滤器实现全局认证

```java

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.FilterChain;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

@Component

public class JwtFilter extends OncePerRequestFilter {

@Autowired

private JwtUtil jwtUtil;

@Override

protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {

String token = request.getHeader("Authorization");

if (token != null && token.startsWith("Bearer ")) {

try {

Claims claims = jwtUtil.parseToken(token.substring(7));

if (claims != null) {

// 用户认证成功,放行

filterChain.doFilter(request, response);

return;

}

} catch (Exception e) {

// 用户认证失败,返回错误信息

response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);

response.getWriter().write("认证失败");

return;

}

}

// 用户未认证,返回错误信息

response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);

response.getWriter().write("认证失败");

}

}

```

5. 配置过滤器

在Spring Boot项目中,我们需要将过滤器注册到过滤器链中:

```java

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.web.servlet.FilterRegistrationBean;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

public class FilterConfig {

@Autowired

private JwtFilter jwtFilter;

@Bean

public FilterRegistrationBean jwtFilterBean() {

FilterRegistrationBean registrationBean = new FilterRegistrationBean<>();

registrationBean.setFilter(jwtFilter);

registrationBean.addUrlPatterns("/api/*"); // 拦截所有/api/开头的请求

return registrationBean;

}

}

```

四、总结

本文详细介绍了Spring Boot整合JWT的过程,包括JWT简介、添加依赖、创建JWT工具类、创建认证控制器、创建过滤器实现全局认证以及配置过滤器。通过本文的学习,相信您已经掌握了如何在Spring Boot项目中实现安全高效的API认证。

相关文章

Java全栈开发:从入门到精通的全方位解析

Java全栈开发:从入门到精通的全方位解析

一、引言 随着互联网的快速发展,全栈开发工程师已经成为市场上备受追捧的技术人才。全栈开发指的是掌握前端、后端以及数据库等多个领域的技术,能够独立完成项目开发。本文将深入解析Java全栈开发,帮助读者...

Kafka Connect:深度解析其在Java行业的应用与优势

Kafka Connect:深度解析其在Java行业的应用与优势

一、Kafka Connect简介 Kafka Connect是Apache Kafka的一个开源组件,它允许用户将数据从各种数据源(如数据库、文件系统、消息队列等)导入到Kafka主题中,也可以将...

Java行业领域事件:回顾与展望,技术变迁中的机遇与挑战

Java行业领域事件:回顾与展望,技术变迁中的机遇与挑战

在过去的几年里,Java行业经历了诸多领域事件,这些事件不仅影响了Java生态系统的走向,也为Java开发者带来了新的机遇和挑战。本文将回顾一些重要的领域事件,并对其背后的技术变迁进行分析,以期为J...

Envoy:Java微服务架构中的高性能网关解析

Envoy:Java微服务架构中的高性能网关解析

随着互联网的快速发展,企业对于应用架构的要求越来越高。微服务架构因其灵活性和可扩展性,逐渐成为主流的架构风格。在微服务架构中,网关作为服务请求的入口,扮演着至关重要的角色。本文将深入解析Java微服...

《开源贡献,Java开发者如何从零开始?》

《开源贡献,Java开发者如何从零开始?》

自从Java语言问世以来,它就在IT行业中占据了重要的地位。Java的强大之处不仅体现在它的跨平台能力上,还体现在其庞大的开源社区。作为Java开发者,参与到开源贡献中不仅能提升自己的技术水平,还能...

Java行业里的“Record”关键字:揭秘其背后的奥秘与应用

Java行业里的“Record”关键字:揭秘其背后的奥秘与应用

在Java编程语言中,关键字“Record”自Java 14版本引入以来,就以其简洁的语法和强大的功能受到了广大开发者的喜爱。本文将深入解析“Record”的关键特性,并结合实际案例,探讨其在Jav...