JWT工具类

package com.salong.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import java.util.Calendar;
import java.util.Map;

/**
 * @author Salong
 * @description  jwt工具类(基于com.auth0.java-jwt 的3.4.0版本,别的版本可能不存在JWT静态类)
 * @date 2020/12/8 9:11
 * @Email:salong0503@aliyun.com
 */
public class JwtUtils {

//     @Value("{jwt.SIGNATURE}")
//     private String SIGNATURES;
 //    @Value("{jwt.DESTORY_DAY}")
 //    private String SIGNATURE;
    /**
     * signature签名
     */
    private static final String SIGNATURE="IU$S&39S%51OKY@NB";
    /**
    * jwt失效时间(天)
     */
    private static final int DESTORY_DAY=7;
    /**
     * 获取token
     * map 为保存到客户端的用户信息,避免存储类似密码等敏感信息
     * @return
     */
   public static String getToken(Map<String,String> map){
       Calendar instance = Calendar.getInstance();
       instance.add(Calendar.DATE,DESTORY_DAY);
       JWTCreator.Builder builder = JWT.create();
       map.forEach((k,v)->{
           builder.withClaim(k,v);
       });
       String token=builder
               .withExpiresAt(instance.getTime())  //设置过期时间
               .sign(Algorithm.HMAC256(SIGNATURE)); //设置签名和加密方式,这里用HMAC256
       return token;
   }
    /**
     * 验证token (无返回信息,异常则验证失败)
     * @param token
     * @return
     */
    public static void verify(String token){
        JWT.require(Algorithm.HMAC256(SIGNATURE)).build().verify(token);
    }

    /**
     * 验证token (返回token信息,异常则验证失败)
     * @param token
     */
   public static DecodedJWT verifyWithInfo(String token){
       return JWT.require(Algorithm.HMAC256(SIGNATURE)).build().verify(token);
   }

}

 

### JWT工具类实现示例 #### 创建JWT 创建JWT的过程涉及构建Header、Payload以及计算Signature。下面是一个简单的Java工具类`JwtUtils`用于生成和解析JWT。 ```java import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import java.util.Date; import java.util.Map; public class JwtUtils { private static final String SECRET_KEY = "yourSecretKey"; // 密钥应更安全地存储 /** * 创建JWT令牌. */ public static String createJwt(Map<String, Object> claims, long ttlMillis) { SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; return Jwts.builder() .setClaims(claims) .signWith(signatureAlgorithm, SECRET_KEY.getBytes()) .setExpiration(new Date(System.currentTimeMillis() + ttlMillis)) .compact(); } /** * 解析JWT并返回载荷内容. */ public static Claims parseJwt(String jwt) { try { return Jwts.parserBuilder() .setSigningKey(SECRET_KEY.getBytes()) .build() .parseClaimsJws(jwt).getBody(); } catch (Exception e) { throw new RuntimeException("Invalid JWT token"); } } } ``` 此代码展示了如何通过指定声明(如用户名)来创建一个带有有效期的JWT,并提供了验证该令牌的方法[^1]。 对于测试有效时间的功能,可以参照给定的例子,在单元测试中模拟这一过程以确保逻辑正确性[^2]: ```java @Test public void testJwtValidityPeriod() throws Exception { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Map<String, Object> claims = new HashMap<>(); claims.put("username", "zss"); String jwt = JwtUtils.createJwt(claims, 3 * 1000L); System.out.println(jwt); Claims parsedClaims = JwtUtils.parseJwt(jwt); Date issuedAt = parsedClaims.getIssuedAt(); Date expiration = parsedClaims.getExpiration(); System.out.println("令牌签发时间:" + sdf.format(issuedAt)); System.out.println("令牌过期时间:" + sdf.format(expiration)); assertTrue(sdf.format(expiration).compareTo(sdf.format(new Date())) >= 0); } ``` 当JWT被成功解码后,可以从其载荷部分提取所需的信息,比如用户的ID或其他自定义字段[^4]: ```java // 假设userIdFieldName是我们在token里设置的一个键名 Object userId = parsedClaims.get("userIdFieldName"); System.out.println("User ID from Token: " + userId); ``` 一旦确认了JWT的有效性和安全性,则可以在应用程序的同层次之间传递这些信息而无需再次查询数据库等外部资源[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

却诚Salong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值