使用 io.jsonwebtoken 实现token的生成与解码

本文介绍了如何在Java中使用jjwt库来生成和解析JSON Web Token(JWT)。首先,导入jjwt依赖,然后展示了生成JWT的代码,包括设置自定义 claims。接着,演示了解析JWT并获取claims内容的过程。最后,提供了一个简单的JWT工具类,用于封装JWT的创建和解析功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过 jsonwebtoken 能够方便的生成token和进行token相关解码,参考文档:https://github.com/jwtk/jjwt#base64 ,详细的操作流程如下所示

导入io.jsonwebtoken依赖:

<dependency>
  <groupId>io.jsonwebtoken</groupId>
  <artifactId>jjwt</artifactId>
  <version>0.9.1</version>
</dependency>

jwt的简单使用:

生成token

@Test
public void testIoJsonWebToken() {
  String key = "myKey";
  HashMap<String, Object> map = new HashMap<>();
  map.put("name", "get");
  String jwt = Jwts.builder()
    .signWith(SignatureAlgorithm.HS256, key)
    .setClaims(map)
    .compact();
  System.out.println(jwt); // eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiZ2V0In0.RiKlMMNgv3XRDcZtxgukAEpOHv_Q9pQQjDPPuPa-Dw0
}

解析token,对生成的token进行解密操作

@Test
public void parseJsonWebToken() {
  String key = "myKey";
  Jws<Claims> jws = Jwts.parser()
    .setSigningKey(key)
 .parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiZ2V0In0.RiKlMMNgv3XRDcZtxgukAEpOHv_Q9pQQjDPPuPa-Dw0");
  System.out.println(jws.getBody());
  System.out.println(jws.getBody().get("name"));
}

封装jwt工具类

实体类:

public class User implements Serializable {
    private String name;
    private Integer age;
    private String password;

    public User(String name, Integer age, String password) {
        this.name = name;
        this.age = age;
        this.password = password;
    }
    // get set 方法
}

工具类:

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

public class JwtHelper {
    private static final String key = "keyxxx";

    public static String createJWT(Object obj) {
        Map<String, Object> map = new HashMap<>();
        Field[] fields = obj.getClass().getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            try {
                map.put(field.getName(), field.get(obj));
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return Jwts.builder()
                .signWith(SignatureAlgorithm.HS256, key)
                .setClaims(map)
                .compact();
    }

    public static Claims parseJWT(String token) {
        return Jwts.parser()
                .setSigningKey(key)
                .parseClaimsJws(token)
                .getBody();
    }
}
好的,以下是Java实现的基于 Token 的身份验证示例代码: ```java import io.jsonwebtoken.Claims; import io.jsonwebtoken.ExpiredJwtException; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import java.util.Date; public class TokenUtils { // 密钥 private static final String SECRET_KEY = "this_is_a_secret_key"; // Token 过期时间为 1 小时 private static final long EXPIRATION_TIME = 3600000; // 生成 Token public static String generateToken(String username) { Date now = new Date(); Date expirationTime = new Date(now.getTime() + EXPIRATION_TIME); return Jwts.builder() .setSubject(username) .setIssuedAt(now) .setExpiration(expirationTime) .signWith(SignatureAlgorithm.HS512, SECRET_KEY) .compact(); } // 验证 Token public static String verifyToken(String token) { try { Claims claims = Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody(); return claims.getSubject(); } catch (ExpiredJwtException e) { // Token 过期 return null; } catch (Exception e) { // Token 无效 return null; } } } ``` 在上面的示例中,使用了 `io.jsonwebtoken` 库生成和验证 Token。在生成 Token 时,设置了 Token 的主题、签发时间和过期时间,并使用了 HS512 签名算法对 Token 进行签名。在验证 Token 时,使用相同的密钥对 Token 进行解码,如果 Token 无效或已过期,则返回 null。 使用示例: ```java public static void main(String[] args) { String token = TokenUtils.generateToken("testUser"); System.out.println(token); String username = TokenUtils.verifyToken(token); System.out.println(username); } ``` 输出结果为: ``` eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ0ZXN0VXNlciIsImlhdCI6MTYyNzI4MDY2NCwiZXhwIjoxNjI3Mjg0MjY0fQ.4xJyZKJYAm-0b1oVzGm3WJsFQFVz2OmvO5NjZ5R9tXO9ez1f2xv3fH5D5SdFcBcZG0Jn4vAkDj2qrxHhUqlaQ testUser ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值