Java JWT Token令牌的使用和封装

话不多说 直接上代码

封装类

package cn.k23.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.SignatureVerificationException;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @Description: 令牌封装
 * @Author: k23
 * @Date: 2022-04-08 10:57
 * @Version: 1.0
 */
public class JwtUtils {
    private String sign = "k23";
    
    public JwtUtils(String sign){
        this.sign=sign;
    }
    public JwtUtils(){

    }
    public String getSign() {
        return sign;
    }
    public void setSign(String sign) {
        this.sign = sign;
    }



    //生成令牌
    public String getToken(Map<String,String> payload, int minutes){
        Calendar c = Calendar.getInstance();
        c.add(Calendar.MINUTE,minutes);
        JWTCreator.Builder builder = JWT.create();
        if(payload!=null)payload.forEach(builder::withClaim);
        String token = builder.withExpiresAt(c.getTime()).sign(Algorithm.HMAC256(sign));
        return token;
    }


    //校验令牌
    public boolean verifyToken(String token){
        boolean flag = false;
        JWTVerifier jv = JWT.require(Algorithm.HMAC256(sign)).build();
        try {
              DecodedJWT dv = jv.verify(token);
              flag=true;
        } catch (TokenExpiredException tee){
          System.out.println("令牌已过期!");
          }catch (SignatureVerificationException sve) {
          System.out.println("令牌异常,签名被非法篡改!");
          } catch (Exception e) {
          System.out.println("令牌异常!");
          }
        return flag;
    }


    //读取令牌负载信息
    public Map<String,String> getPayLoad(String token){
        Map<String,String> map = new HashMap<>();
        if (verifyToken(token)){
            JWTVerifier jv = JWT.require(Algorithm.HMAC256(sign)).build();
            try {
               DecodedJWT dv = jv.verify(token);
              Map<String, Claim> mc = dv.getClaims();
              for (String k:mc.keySet()){
                  map.put(k,k.equalsIgnoreCase("exp")?String.format("%tF %<tT",mc.get(k).asDate()):mc.get(k).asString());
              }


            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    return map;

}

}

使用

package cn.k23.utils;

/**
 * @Description:
 * @Author: k23
 * @Date: 2022-04-08 11:54
 * @Version: 1.0
 */
public class JwtOk {
    public static void main(String[] args) {
        //生成5分钟有限期令牌
        System.out.println(new JwtUtils("k23").getToken(null,5));


        //校验令牌
        String t = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NDkzOTEwOTh9.WF8MvKfjQUg70ngAihgVnpr7Vq32gQ16PUChpZ61BCs";
        System.out.println(new JwtUtils("k23").verifyToken(t));
        System.out.println(new JwtUtils("k23").getPayLoad(t));
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42436236/article/details/124045129
今日推荐