> 文章列表 > 【SpringBoot】使用JWT验证

【SpringBoot】使用JWT验证

【SpringBoot】使用JWT验证

文章目录

  • 简介
  • 使用
    • 生成Token
    • 验证Token
    • 获取Token载荷中的信息
    • 完整代码

简介

JWT,全称为 JSON Web Token,是一种基于 JSON 的开放标准(RFC 7519),用于在不同应用之间传递信息的简洁、安全的标准。JWT 通常被用来在客户端和服务器之间传递身份信息,以实现用户认证和授权等功能。

JWT 主要由三部分组成:

  • 头部(Header) :头部包含 JWT 的类型(即“JWT”)和所使用的算法(如 HS256 或 RS256 等)。
  • 载荷(Payload) :载荷部分用于存储 JWT 的有效负载信息,包括用户信息、权限、过期时间等。
  • 签名(Signature):签名部分是对头部和载荷进行签名的结果,用于保证 JWT 的完整性和真实性。

JWT 的主要优点是简洁、安全、易于传递和存储。由于 JWT 包含了完整的用户信息,因此不需要在每次请求时重新向服务器发送用户信息,从而减少了网络流量和服务器压力。此外,JWT 还可以使用公钥和私钥进行签名和验证,确保 JWT 的安全性。

使用

在pom.xml中引入

<dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.4.0</version>
</dependency>

测试环境为Spring Boot 2.3.3

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.peng.entity.User; // 用户实体类
import java.util.Calendar;

生成Token

用于用户登陆成功时,生成Token返回给前端,前端浏览器通本地存储。

    /*** 生成token* @param user  //传入payload* @return 返回token*/public static String getToken(User user){// 创建Token 并存入信息JWTCreator.Builder builder = JWT.create();builder.withClaim("userName",user.getUserName());builder.withClaim("phone",user.getPhone());builder.withClaim("id",user.getId());builder.withClaim("role",user.getRole());builder.withClaim("age",user.getAge());// 存入过期时间Calendar instance = Calendar.getInstance();instance.add(Calendar.DATE,1);builder.withExpiresAt(instance.getTime());// 加密并返回return builder.sign(Algorithm.HMAC256(TOKEN)).toString();}

验证Token

用于验证前端提交到后端的Token是否有效未过期。

   /*** 验证token* @param token* @return*/public static void verify(String token){JWT.require(Algorithm.HMAC256(TOKEN)).build().verify(token);}

获取Token载荷中的信息

获取在生产Token时存入的用户信息。

    /*** 得到token中的信息* @param token* @return*/public static User getInfo(String token){DecodedJWT verify = JWT.require(Algorithm.HMAC256(TOKEN)).build().verify(token);User user = new User();user.setId(verify.getClaim("id").asLong());user.setUserName(verify.getClaim("userName").asString());user.setPhone(verify.getClaim("phone").asString());user.setRole(verify.getClaim("role").asString());System.out.println("JTWUtils.java: getInfo()中的获取的用户信息:"+user.toString());return user;}

完整代码

package com.peng.framework.jwt;import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.peng.entity.User;
import java.util.Calendar;/*** @Author * @Date 2021-02-08 7:46 下午* @Description*/
public class JWTUtils {private static String TOKEN = "token!Q@W3e4r";/*** 生成token* @param user  //传入payload* @return 返回token*/public static String getToken(User user){// 创建Token 并存入信息JWTCreator.Builder builder = JWT.create();builder.withClaim("userName",user.getUserName());builder.withClaim("phone",user.getPhone());builder.withClaim("id",user.getId());builder.withClaim("role",user.getRole());builder.withClaim("age",user.getAge());// 存入过期时间Calendar instance = Calendar.getInstance();instance.add(Calendar.DATE,1);builder.withExpiresAt(instance.getTime());// 加密并返回return builder.sign(Algorithm.HMAC256(TOKEN)).toString();}/*** 验证token* @param token* @return*/public static void verify(String token){JWT.require(Algorithm.HMAC256(TOKEN)).build().verify(token);}/*** 获取token中payload* @param token* @return*/public static DecodedJWT getTokenPayload(String token){return JWT.require(Algorithm.HMAC256(TOKEN)).build().verify(token);}/*** 得到token中的信息* @param token* @return*/public static User getInfo(String token){DecodedJWT verify = JWT.require(Algorithm.HMAC256(TOKEN)).build().verify(token);User user = new User();user.setId(verify.getClaim("id").asLong());user.setUserName(verify.getClaim("userName").asString());user.setPhone(verify.getClaim("phone").asString());user.setRole(verify.getClaim("role").asString());System.out.println("JTWUtils.java: getInfo()中的获取的用户信息:"+user.toString());return user;}
}