原創: shiro的token jwtUtils加解密工具包源碼


 

添加依賴pom.xml

 <!-- JAVA代碼生成JWT-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.0</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.1.37</version>
        </dependency>
<!--        SONObject只是一種數據結構,可以理解為JSON格式的數據結構(key-value 結構),可以使用put方法給json對象添加元素。-->
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20140107</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>

 

jwtUtils.java

package com.ibaiqi.house.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.sun.org.apache.xml.internal.security.algorithms.implementations.SignatureDSA;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import org.apache.shiro.codec.Base64;
import io.jsonwebtoken.SignatureAlgorithm;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Date;

public class JwtUtils {
 
    //密碼
    private static final String secret = "66diangezanbageixioapang12oc";

       /**
     * (默認的超時時間)token存活時間,2小時
     */
    private static final long liveMills = 3600 * 2 * 1000;


    /**
     * 獲取secret
     */
    public static SecretKey obtainKey() {

        //對key進行解碼
        byte[] secretBytes = secret.getBytes();
        return new SecretKeySpec(secretBytes, 0, secretBytes.length, "AES");
    }

    /**
     * 獲取token,使用默認的超時時間,即2個小時。
     *
     * @param sub 主題(需要加密的字符串)
     * @return token字符串
     */
    public static String createJWT(String sub) {
        return createJWT(sub, liveMills);
    }

    /**
     * 會自動對主題對象序列化(使用fastJson進行序列化)得到字符串
     *
     * @param subObj 主題對象
     * @return token字符串
     */
    public static <T> String createJWT(T subObj) {
        return createJWT(JSONObject.toJSONString(subObj), liveMills);
    }

    /**
     * 會自動對主題對象序列化(使用fastJson進行序列化)得到字符串
     *
     * @param subObj    主題對象
     * @param liveMills 失效時間,單位毫秒
     * @return token字符串
     */
    public static <T> String createJWT(T subObj, Long liveMills) {
        return createJWT(JSONObject.toJSONString(subObj), liveMills);
    }

    /**
     * @param sub       需要加密的主題
     * @param liveMills 失效時間,單位毫秒
     * @return 經過jwt加密的token字符串,失效時間即當前時間+liveMills毫秒數
     */
    public static String createJWT(String sub, Long liveMills) {
        //加密模式
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

        long currentTimeMillis = System.currentTimeMillis();
        Date now = new Date(currentTimeMillis);  //iat token簽發時間
        SecretKey secretKey = obtainKey();
        //jti表示該token的唯一id,不推薦使用相同值|isa 下發時間
        JwtBuilder jwtBuilder = Jwts.builder().setId("jti-xp").
                setIssuedAt(now). //設置簽發時間
                setSubject(sub).
                signWith(signatureAlgorithm, secretKey);////設置簽名秘鑰
        if (liveMills > 0) {
            long expMills = currentTimeMillis + liveMills;
            Date expDate = new Date(expMills);  //失效時間
            jwtBuilder.setExpiration(expDate);
        }
        return jwtBuilder.compact();
    }

    /**
     * 解密token,返回Claims對象
     * <p>
     * 注,若token失效,會拋出{@link ExpiredJwtException}的異常
     **/
    public static Claims parseJWT(String token) {
        SecretKey key = obtainKey();
        return Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody();  // Claims [kleɪmz] 聲明
    }

    /**
     * 解析token獲取到sub(主題)。
     * <p>
     * 注,若token失效,會拋出{@link ExpiredJwtException}的異常
     */
    public static String parseJWT2Sub(String token) {
        SecretKey key = obtainKey();
        Claims body = Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody();
        return body.getSubject();
    }

    /**
     * 解密token獲取sub,並反序列化為對象。
     *
     * @param token 需要解密的token字符串
     * @param clazz sub反序列化的對象類型
     */
    public static <T> T parseJWT2Sub(String token, Class<T> clazz) {
        SecretKey key = obtainKey();
        Claims body = Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody();
        return JSON.parseObject(body.getSubject(), clazz);
    }


    public static void main(String[] args) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("username", "xiaopang");
        jsonObject.put("host", "127.0.0.1");
        System.out.println("jsonObject.toJSONString()的值:"+jsonObject.toJSONString());
        String token = JwtUtils.createJWT(jsonObject.toJSONString());
        System.out.println("生成的token:"+token);
        //解析token
        Claims claims = parseJWT(token);
        String subject = claims.getSubject();
        System.out.println(subject);
        //base64 payload解析
        String payload="eyJqdGkiOiJqdGkteHAiLCJpYXQiOjE1NjM5NDcxMTAsInN1YiI6IntcImhvc3RcIjpcIjEyNy4wLjAuMVwiLFwidXNlcm5hbWVcIjpcInhpYW9wYW5nXCJ9IiwiZXhwIjoxNTYzOTU0MzEwfQ";
        //org.apache.shiro.codec.Base64
        System.out.println("payload的base64解密:"+new String(Base64.decode(payload)));
        //base64 header解析
        String header="eyJhbGciOiJIUzI1NiJ9";
        System.out.println("header的base64解密:"+new String(Base64.decode(header)));
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM