一.什么是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⾥⾯