You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何验证JWT令牌?能否通过REST API实现(Java Spring Boot+React栈)

可以实现,以下是基于Spring Boot后端+React前端的JWT验证REST API方案

一、Spring Boot后端实现JWT验证接口

1. 依赖准备

如果未引入JWT相关依赖,在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>

2. 编写验证接口

创建控制器类,提供POST接口接收JWT令牌并完成验证:

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import javax.crypto.SecretKey;
import java.util.Map;

@RestController
public class JwtValidationController {

    @Value("${jwt.secret}")
    private String secretKeyStr;

    @PostMapping("/api/auth/validate-token")
    public Map<String, Object> validateToken(@RequestBody Map<String, String> request) {
        String token = request.get("token");
        SecretKey secretKey = Keys.hmacShaKeyFor(secretKeyStr.getBytes());
        
        try {
            // 解析令牌,自动验证签名、过期时间等规则
            Claims claims = Jwts.parserBuilder()
                    .setSigningKey(secretKey)
                    .build()
                    .parseClaimsJws(token)
                    .getBody();

            // 验证通过,返回令牌中的声明信息
            return Map.of(
                    "valid", true,
                    "userId", claims.get("userId"),
                    "expiration", claims.getExpiration()
            );
        } catch (Exception e) {
            // 捕获所有JWT验证异常,返回错误信息
            return Map.of(
                    "valid", false,
                    "error", e.getMessage()
            );
        }
    }
}

3. 配置密钥

在application.yml中配置与生成JWT时一致的密钥,避免硬编码:

jwt:
  secret: your-strong-256bit-secret-key-here-keep-it-safe

二、React前端调用验证接口

1. 封装验证函数

编写工具函数发送请求到后端验证令牌:

export async function validateJwtToken(token) {
    try {
        const response = await fetch('/api/auth/validate-token', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({ token }),
        });
        return await response.json();
    } catch (error) {
        console.error('令牌验证请求失败:', error);
        return { valid: false, error: '网络异常' };
    }
}

2. 组件中使用示例

在需要验证的组件中调用函数处理验证逻辑:

import { validateJwtToken } from './utils/auth';

function TokenValidation() {
    const handleValidate = async () => {
        const token = localStorage.getItem('jwtToken');
        if (!token) {
            alert('未检测到登录令牌');
            return;
        }

        const result = await validateJwtToken(token);
        if (result.valid) {
            alert(`令牌有效,用户ID: ${result.userId}`);
        } else {
            alert(`令牌无效: ${result.error}`);
            // 处理无效令牌逻辑,比如清除缓存并跳转登录页
            localStorage.removeItem('jwtToken');
            window.location.href = '/login';
        }
    };

    return (
        <button onClick={handleValidate}>验证当前登录令牌</button>
    );
}

export default TokenValidation;

三、跨服务验证扩展建议

如果有多服务需要验证同一JWT,可采用以下方案:

  • 将JWT验证逻辑封装为Spring Boot Starter公共组件,供所有服务依赖调用,避免重复代码。
  • 搭建统一认证中心,所有服务通过调用认证中心的验证接口完成校验,确保规则一致性。

内容的提问来源于stack exchange,提问作者Leonardo Cerchioni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 01:27:30