JJWT 0.11.2使用,工具类

方案一

导入JJWT依赖


        <dependency>
            <groupId>io.jsonwebtokengroupId>
            <artifactId>jjwt-apiartifactId>
            <version>0.11.2version>
        dependency>
        <dependency>
            <groupId>io.jsonwebtokengroupId>
            <artifactId>jjwt-implartifactId>
            <version>0.11.2version>
            <scope>runtimescope>
        dependency>
        <dependency>
            <groupId>io.jsonwebtokengroupId>
            <artifactId>jjwt-jacksonartifactId>
            <version>0.11.2version>
            <scope>runtimescope>
        dependency>
        
     

工具类

工具类可以自行改造使用构建器方式创建
package com.woniu.utils;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import org.springframework.stereotype.Component;
import javax.crypto.SecretKey;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

//@Component
public class JwtUtils {
//    @Value("{jwt.skin.key}")
    //key的大小必须大于或等于256bit,需要32位英文字符,一个英文字符为:8bit,一个中文字符为12bit
    private String key="ssssssssssdfdsafasfdssdfsfsfssfs";
    //设置加密算法
    private SignatureAlgorithm signatureAlgorithm=SignatureAlgorithm.HS256;
    /**
     * 获取转换后的私钥对象
     * @return
     */
    public SecretKey getSecretKey(){
        return Keys.hmacShaKeyFor(key.getBytes());
    }
    /**
     * 生成JWT
     * @param exp 指定过期时间,不能小于当前时间
     * @param payLoad 携带的数据
     * @return
     */
    public String createJwt(Date exp , Map<String,Object> payLoad){
       return Jwts.builder()
                .setClaims(payLoad)
                .setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(exp)
                .signWith(getSecretKey(),signatureAlgorithm)
                .compact();
    }

    /**
     * 解析JWS,返回一个布尔结果
     * @param jwsString
     * @return
     */
    public Boolean parseJwt(String jwsString){
        boolean result= false;
        try {
            Jwts.parserBuilder()
                    .setSigningKey(getSecretKey())
                    .build()
                    .parseClaimsJws(jwsString);
            result=true;
        }catch (JwtException e){
           result=false;
        }finally {
            return result;
        }
    }

    /**
     * 解析Jws,返回一个Jws对象
     * @param jwsString
     * @return
     */
    public Jws parseJwtResultJws(String jwsString){
        Jws<Claims> claims=null;
        try {
            claims = Jwts.parserBuilder()
                    .setSigningKey(getSecretKey())
                    .build()
                    .parseClaimsJws(jwsString);
        }catch (JwtException e){
            e.printStackTrace();
        }
        return claims;
    }
    /**
     * 获取header中的数据
     * @param jwsString
     * @return
     */
    public Map<String,Object> getHeader(String jwsString){
        return parseJwtResultJws(jwsString).getHeader();
    }

    /**
     * 获取PayLoad中携带的数据
     * @param jwsString
     * @return
     */
    public Map<String,Object> getPayLoad(String jwsString){
        return ((Map<String, Object>) (parseJwtResultJws(jwsString)).getBody());
    }

    /**
     * 获取除去exp和iat的数据,exp:过期时间,iat:JWT生成的时间
     * @param jwsString
     * @return
     */
    public Map<String,Object> getPayLoadALSOExcludeExpAndIat(String jwsString){
        Map<String, Object> map = getPayLoad(jwsString);
        map.remove("exp");
        map.remove("iat");
        return map;
    }

    public static void main(String[] args) {
        JwtUtils jwtUtils = new JwtUtils();
        Date exp = new Date(System.currentTimeMillis()+60*60*24);
        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("name","张三");
        String jwt = jwtUtils.createJwt(exp, hashMap);
        System.out.println(jwt);
        System.out.println(jwtUtils.getPayLoadALSOExcludeExpAndIat(jwt));
    }

}


测试结果

在这里插入图片描述

方案二

导入JJWT依赖


 		<dependency>
            <groupId>com.alibabagroupId>
            <artifactId>fastjsonartifactId>
            <version>1.2.60version>
        dependency>

        <dependency>
            <groupId>io.jsonwebtokengroupId>
            <artifactId>jjwt-apiartifactId>
            <version>0.11.2version>
        dependency>
        <dependency>
            <groupId>io.jsonwebtokengroupId>
            <artifactId>jjwt-implartifactId>
            <version>0.11.2version>
            <scope>runtimescope>
        dependency>
        <dependency>
            <groupId>io.jsonwebtokengroupId>
            <artifactId>jjwt-jacksonartifactId>
            <version>0.11.2version>
            <scope>runtimescope>
        dependency>
        
     

工具类

package com.woniu.utils;
import com.alibaba.fastjson.JSON;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import org.springframework.stereotype.Component;
import org.springframework.util.Base64Utils;
import javax.crypto.SecretKey;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

//@Component
public class JwtUtils {
    //@Value("{jwt.skin.key}")
    //key的大小必须大于或等于256bit,需要32位英文字符,一个英文字符为:8bit,一个中文字符为12bit
    private String key="ssssssssssdfdsafasfdssdfsfsfssfs";
    //设置加密算法
    private SignatureAlgorithm signatureAlgorithm=SignatureAlgorithm.HS256;
    //获取header中的数据
    private final Integer GET_HEADER_DATA =0;
    //获取payload中的数据
    private final Integer GET_PAYLOAD_DATA =1;
    /**
     * 获取转换后的私钥对象
     * @return
     */
    public SecretKey getSecretKey(){
        return Keys.hmacShaKeyFor(key.getBytes());
    }

    /**
     * 生成JWT
     * @param exp 指定过期时间,不能小于当前时间
     * @param payLoad 携带的数据
     * @return
     */
    public String createJwt(Date exp , Map<String,Object> payLoad){
       return Jwts.builder()
                .setClaims(payLoad)//设置携带参数
                .setIssuedAt(new Date(System.currentTimeMillis()))//创建时间
                .setExpiration(exp)//过期时间
                .signWith(getSecretKey(),signatureAlgorithm)//设置加密算法和私钥
                .compact();
    }

    /**
     * 解析JWS,返回一个布尔结果
     * @param jwsString
     * @return
     */
    public Boolean parseJwt(String jwsString){
        boolean result= false;
        try {
            Jwts.parserBuilder()
                    .setSigningKey(getSecretKey())//设置私钥
                    .build()
                    .parseClaimsJws(jwsString);//要解析的jws
            result=true;
        }catch (JwtException e){
            e.getMessage();
        }
        return result;
    }


    public String getJson(String jwsString,Integer code){
        //判断解析结果如果失败返回空,如果有全局异常处理,此处可抛自定义异常进行处理
        if(!parseJwt(jwsString)) return null;
        //将jws中的数据编码串截取出来使用Base64解析成字节数组
        byte[] decodePayLoad = Base64Utils.decodeFromString(jwsString.split("\\.")[code]);
        return new String(decodePayLoad);
    }

    public Map<String,Object> getData(String jwsString,Integer code){
        //此处使用的阿里的fastJson,可使用其他的工具将字节json字节转map
        return JSON.parseObject(getJson(jwsString,code),Map.class);
    }

    /**
     * 获取header中的数据
     * @param jwsString
     * @return
     */
    public Map<String,Object> getHeader(String jwsString){
        return getData(jwsString,GET_HEADER_DATA);
    }

    /**
     * 获取PayLoad中携带的数据
     * @param jwsString
     * @return
     */
    public Map<String,Object> getPayLoad(String jwsString){
        return getData(jwsString,GET_PAYLOAD_DATA);
    }

    /**
     * 获取除去exp和iat的数据,exp:过期时间,iat:JWT生成的时间
     * @param jwsString
     * @return
     */
    public Map<String,Object> getPayLoadALSOExcludeExpAndIat(String jwsString){
        Map<String, Object> map = getData(jwsString, GET_PAYLOAD_DATA);
        map.remove("exp");
        map.remove("iat");
        return map;
    }


    /**
     * 测试
     * @param args
     */
    public static void main(String[] args) {
        //创建一个过期时间
        Date date = new Date(System.currentTimeMillis()+60*60*24);
        //设置要携带的数据
        Map<String,Object> map = new HashMap<>();
        map.put("name","张三");
        //创建工具类对象
        JwtUtils jwtUtils = new JwtUtils();
        String jwt = jwtUtils.createJwt(date, map);
        System.out.println(jwt);
        jwtUtils.parseJwt(jwt);
        System.out.println(jwtUtils.getPayLoad(jwt));
    }
}

测试结果

JJWT 0.11.2使用,工具类_第1张图片

jwt官网

jwt官网:https://jwt.io
源码:https://github.com/jwtk/jjwt#install-jdk

你可能感兴趣的:(JWT,JJWT,0.11.2,java,开发语言,后端)