spring boot項目如何通過JWT工具生成token以及逆向解密token?


一.什么是JWT?

JWT 是一個開放標准,它定義了⼀種⽤於簡潔,自包含的用於通信雙方之間以 JSON 對象的
形式安全傳遞信息的方法。 可以使用 HMAC 算法或者是 RSA 的公鑰密鑰對進行簽名,簡單來
說: 就是通過⼀定規范來⽣成token,然后可以通過解密算法逆向解密token,這樣就可以獲取
用戶信息

二.首先需要在pom.xml文件中添加相應的依賴

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

三.在Utils包中建立JWTSUtils類實現生成token

/**
 * JWT工具類
 * 注意點:
 * 1.生成的token是可以通過base64進行解密出明文信息
 * 2.base64進行解密出的明文信息,修改再進行編碼,則會解密失敗
 * 3.無法作廢已經頒布的令牌token,除非改密鑰
 */
public class JWTUtils {
    /**
     * 過期時間為一周
     */
    private static final long Expire=60000*60*24*7;
    /**
     * 密鑰
     */
    private static final String secret="xdclass.net168";
    /**
     * 令牌前綴
     */
    private static final String Token_PreFix="xdclass";
    /**
     * subject主題
     */
    private static final String SUBJECT="xdclass";

    /**
     * 根據用戶信息生成令牌
     * @param user
     * @return
     */
    public static String geneJsonWebToken(User user){
        String token = Jwts.builder().setSubject(SUBJECT)
                .claim("head_img", user.getHeadImg())
                .claim("id", user.getId())
                .claim("name", user.getName())
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + Expire))
                .signWith(SignatureAlgorithm.HS256, secret).compact();
        token=Token_PreFix+token;
        return token;
    }

注解:

JWT格式組成 頭部、負載、簽名
header+payload+signature
頭部:主要是描述簽名算法
負載:主要描述是加密對象的信息,如⽤戶的id等,也可以加些規范⾥⾯的東⻄,如iss
簽發者,exp 過期時間,sub ⾯向的⽤戶
簽名:主要是把前⾯兩部分進⾏加密,防⽌別⼈拿到token進⾏base解密后篡改token
 
代碼解釋:.claim("head_img", user.getHeadImg()) .claim("id", user.getId()).claim("name", user.getName())鏈式調用在負載里注入圖片信息,id,用戶名。
                  
         setIssuedAt(new Date())設置開始時間
         setExpiration(new Date(System.currentTimeMillis() + Expire))設置過期時間
         signWith(SignatureAlgorithm.HS256, secret)用私鑰對簽名算法進行加密
四.通過Jwts逆向解密token
public static Claims checkJWT(String token){
        try{
            final Claims claims = Jwts.parser().setSigningKey(secret)
                    .parseClaimsJws(token.replace(Token_PreFix, ""))
                    .getBody();
            return claims;
        }catch (Exception e){
            return null;
        }
    }
setSigningKey(secret)通過私鑰對token進行解密
五.關於JWT客戶端存儲
   可以存儲在cookie,localstorage和sessionStorage⾥⾯
 


免責聲明!

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



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