日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JWT操作工具类分享

發布時間:2024/9/27 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JWT操作工具类分享 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

分享個人操作的JWT的工具類,基于jjwt庫,這是Java圈子中最流行的JWT操作庫。

文章目錄

          • 一、應用場景
          • 二、實戰案例
            • 1. jjwt 開源地址
            • 2. 加依賴
            • 3. 工具類
            • 4. 寫配置
            • 5. 使用
          • 三、企業需求

一、應用場景

給用戶不敏感信息生成token,作為用戶登陸的唯一標識,訪問后端都必須攜帶token,也就是說,后端處理前端請求時會先判斷token是否合法,不合法直接響應狀態碼;合法正常處理請求。

前后端分離項目采用session 和cookie即可,前后端分離場景:建議采用token,因為有了跨域問題。

二、實戰案例
1. jjwt 開源地址

GIthub:https://github.com/jwtk/jjwt

2. 加依賴
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.1</version></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>0.11.1</version><scope>runtime</scope></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId> <!-- or jjwt-gson if Gson is preferred --><version>0.11.1</version><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version><scope>provided</scope></dependency><!-- https://mvnrepository.com/artifact/commons-codec/commons-codec --><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.14</version></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>20.0</version></dependency>
3. 工具類
package com.itmuch.usercenter.util;import com.google.common.collect.Maps; import io.jsonwebtoken.*; import io.jsonwebtoken.security.Keys; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.binary.Base64; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;import javax.crypto.SecretKey; import java.util.Date; import java.util.HashMap; import java.util.Map;@Slf4j @RequiredArgsConstructor @SuppressWarnings("WeakerAccess") @Component public class JwtOperator {/*** 秘鑰* - 默認aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrsssttt*/@Value("${secret:aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrsssttt}")private String secret;/*** 有效期,單位秒* - 默認2周*/@Value("${expire-time-in-second:1209600}")private Long expirationTimeInSecond;/*** 從token中獲取claim** @param token token* @return claim*/public Claims getClaimsFromToken(String token) {try {return Jwts.parser().setSigningKey(this.secret.getBytes()).parseClaimsJws(token).getBody();} catch (ExpiredJwtException | UnsupportedJwtException | MalformedJwtException | IllegalArgumentException e) {log.error("token解析錯誤", e);throw new IllegalArgumentException("Token invalided.");}}/*** 獲取token的過期時間** @param token token* @return 過期時間*/public Date getExpirationDateFromToken(String token) {return getClaimsFromToken(token).getExpiration();}/*** 判斷token是否過期** @param token token* @return 已過期返回true,未過期返回false*/private Boolean isTokenExpired(String token) {Date expiration = getExpirationDateFromToken(token);return expiration.before(new Date());}/*** 計算token的過期時間** @return 過期時間*/public Date getExpirationTime() {return new Date(System.currentTimeMillis() + this.expirationTimeInSecond * 1000);}/*** 為指定用戶生成token** @param claims 用戶信息* @return token*/public String generateToken(Map<String, Object> claims) {Date createdTime = new Date();Date expirationTime = this.getExpirationTime();byte[] keyBytes = secret.getBytes();SecretKey key = Keys.hmacShaKeyFor(keyBytes);return Jwts.builder().setClaims(claims).setIssuedAt(createdTime).setExpiration(expirationTime)// 你也可以改用你喜歡的算法// 支持的算法詳見:https://github.com/jwtk/jjwt#features.signWith(key, SignatureAlgorithm.HS256).compact();}/*** 判斷token是否非法** @param token token* @return 未過期返回true,否則返回false*/public Boolean validateToken(String token) {return !isTokenExpired(token);}// public static void main(String[] args) { // // 1. 初始化 // JwtOperator jwtOperator = new JwtOperator(); // jwtOperator.expirationTimeInSecond = 1209600L; // jwtOperator.secret = "aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrsssttt"; // // // 2.設置用戶信息 // HashMap<String, Object> objectObjectHashMap = Maps.newHashMap(); // objectObjectHashMap.put("id", "1"); // // // 測試1: 生成token // String token = jwtOperator.generateToken(objectObjectHashMap); // // 會生成類似該字符串的內容: eyJhbGciOiJIUzI1NiJ9.eyJpZCI6IjEiLCJpYXQiOjE1NjU1ODk4MTcsImV4cCI6MTU2Njc5OTQxN30.27_QgdtTg4SUgxidW6ALHFsZPgMtjCQ4ZYTRmZroKCQ // System.out.println(token); // // // 將我改成上面生成的token!!! // String someToken = "eyJhbGciOiJIUzI1NiJ9.eyJpZCI6IjEiLCJpYXQiOjE1NjU1OTQ1NjIsImV4cCI6MTU2NjgwNDE2Mn0.PAvWPcQAZnSlYKNbZr4O1l9aA4LPphuq0OG2QIs7O5E\n"; // // 測試2: 如果能token合法且未過期,返回true // Boolean validateToken = jwtOperator.validateToken(someToken); // System.out.println(validateToken); // // // 測試3: 獲取用戶信息 // Claims claims = jwtOperator.getClaimsFromToken(someToken); // System.out.println(claims); // // // 將我改成你生成的token的第一段(以.為邊界) // String encodedHeader = "eyJhbGciOiJIUzI1NiJ9"; // // 測試4: 解密Header // byte[] header = Base64.decodeBase64(encodedHeader.getBytes()); // System.out.println(new String(header)); // // // 將我改成你生成的token的第二段(以.為邊界) // String encodedPayload = "eyJpZCI6IjEiLCJpYXQiOjE1NjU1ODk1NDEsImV4cCI6MTU2Njc5OTE0MX0"; // // 測試5: 解密Payload // byte[] payload = Base64.decodeBase64(encodedPayload.getBytes()); // System.out.println(new String(payload)); // // // 測試6: 這是一個被篡改的token,因此會報異常,說明JWT是安全的 // jwtOperator.validateToken("eyJhbGciOiJIUzI1NiJ9.eyJpZCI6IjEiLCJpYXQiOjE1NjU1ODk3MzIsImV4cCI6MTU2Njc5OTMzMn0.nDv25ex7XuTlmXgNzGX46LqMZItVFyNHQpmL9UQf-aUxxx"); // } }
4. 寫配置
jwt:secret: aaaaaaabbbbbbcccccdddddaaaaaaabbbbbbcccccdddddaaaaaaabbbbbbcccccddddd# 有效期,單位秒,默認2周expire-time-in-second: 1209600
5. 使用
@Autowiredprivate final JwtOperator jwtOperator;
三、企業需求

1.首先寫一個攔截器,攔截前端的所有請求
2.獲取請求頭部header中的token是否合法
1>合法正常處理請求
2>不合法拋出自定義異常和狀態碼

問題1:
為什么是自定義異常?

釋義:
由于不能講控制臺的異常直接拋出到前端頁面,這樣不友好,定義全局異常處理類,根據需求自定義異常信息和狀態碼。
例如:token不合法,狀態碼是401

private void checkToken() {try {// 1. 從header里面獲取tokenHttpServletRequest request = getHttpServletRequest();String token = request.getHeader("X-Token");// 2. 校驗token是否合法&是否過期;如果不合法或已過期直接拋異常;如果合法放行Boolean isValid = jwtOperator.validateToken(token);if (!isValid) {throw new SecurityException("Token不合法!");}// 3. 如果校驗成功,那么就將用戶的信息設置到request的attribute里面Claims claims = jwtOperator.getClaimsFromToken(token);request.setAttribute("id", claims.get("id"));request.setAttribute("wxNickname", claims.get("wxNickname"));request.setAttribute("role", claims.get("role"));} catch (Throwable throwable) {throw new SecurityException("Token不合法");}}

總結

以上是生活随笔為你收集整理的JWT操作工具类分享的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。