您好,登錄后才能下訂單哦!
本篇內容主要講解“JAVA中JWT怎么創建token”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“JAVA中JWT怎么創建token”吧!
JSON Web Token(縮寫 JWT)是目前最流行的跨域認證解決方案。 JWT 的三個部分依次如下 Header(頭部):是一個 JSON 對象,描述 JWT 的元數據{ "alg": "HS256", typ": "JWT" } Payload(負載):也是一個 JSON 對象,用來存放實際需要傳遞的數據,JWT 規定了7個官方字段: iss (issuer):簽發人 exp (expiration time):過期時間 sub (subject):主題 aud (audience):受眾 nbf (Not Before):生效時間 iat (Issued At):簽發時間 jti (JWT ID):編號 Signature(簽名):對前兩部分的簽名,防止數據篡改 1.JWT中Header頭和Payload有效載荷序列化的算法都用到了Base64URL,簽名哈希部分是對Header與Payload兩部分數據簽名 2.客戶端接收服務器返回的JWT,將其存儲在Cookie或localStorage中,客戶端將在與服務器交互中都會帶JWT,將它放入HTTP請求的Header Authorization字段中 3.JWT的最大缺點是服務器不保存會話狀態,所以在使用期間不可能取消令牌或更改令牌的權限 4.JWT本身包含認證信息,因此一旦信息泄露,任何人都可以獲得令牌的所有權限 5.JWT不建議使用HTTP協議來傳輸代碼,而是使用加密的HTTPS協議進行傳輸
pom.xml引入依賴包
<!-- JWT Token驗證機制 --> <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.8.1</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.0</version> </dependency>
工具類
import com.auth0.jwt.JWT; import com.auth0.jwt.JWTCreator; import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.exceptions.SignatureVerificationException; import com.auth0.jwt.exceptions.TokenExpiredException; import com.auth0.jwt.interfaces.Claim; import org.apache.commons.lang3.time.DateUtils; import java.util.Date; import java.util.HashMap; import java.util.Map; /** * @Description JWT跨域管理token工具類 * @Author JL * @Date 2019/08/08 * @Version V1.0 */ public class JwtTokenUtils { /** * 加密密鑰 */ private static final String SECRET = "wNmx01w27MQnPc3BtUQkty_23P0pVlAdj86o5XznUrE"; /** * jwt創建token,考慮安全性,token中不因該放入太多信息(勿放密碼之類的敏感信息),只放入關鍵字段值即可,如用戶ID * @param sub 主題(可以放入關鍵數據,如:userid, 用戶唯一值等) * @param timeout 過期時長(秒) * @return */ public static String createToken(String sub, int timeout) { JWTCreator.Builder builder = JWT.create(); builder.withSubject(sub);//主題 builder.withIssuer("pro-server"); builder.withExpiresAt(DateUtils.addSeconds(new Date(), timeout));//過期時間,30秒后過期 String jwtToken = builder.sign(Algorithm.HMAC256(SECRET)); return jwtToken; } /** * 對jwt創建的token進行驗簽與解析,返回Subject(主題)中存放的內容 * @param token * @return * @throws TokenExpiredException 會話超時異常 * @throws SignatureVerificationException 驗簽無效異常 */ public static String parseToken(String token) throws TokenExpiredException, SignatureVerificationException { return JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token).getSubject(); } /** * jwt創建token,考慮安全性,token中不因該放入太多信息(勿放密碼之類的敏感信息) * @param loadMap 數據集合 * @param timeout 過期時長(秒) * @return */ public static String createToken(Map<String, Object> loadMap, int timeout) { JWTCreator.Builder builder = JWT.create(); loadMap.forEach((k, v) -> { if (v instanceof String) { builder.withClaim(k, (String) v); } else if (v instanceof Date) { builder.withClaim(k, (Date) v); } else if (v instanceof Long) { builder.withClaim(k, (Long) v); } else if (v instanceof Integer) { builder.withClaim(k, (Integer) v); } else if (v instanceof Boolean) { builder.withClaim(k, (Boolean) v); } }); builder.withIssuer("pro-server"); builder.withExpiresAt(DateUtils.addSeconds(new Date(), timeout));//過期時間,30秒后過期 String jwtToken = builder.sign(Algorithm.HMAC256(SECRET)); return jwtToken; } /** * 對jwt創建的token進行驗簽與解析,返回集合 * @param token * @return * @throws TokenExpiredException 會話超時異常 * @throws SignatureVerificationException 驗簽無效異常 */ public static Map<String, Object> parseTokenToMap(String token) throws TokenExpiredException, SignatureVerificationException { Map<String, Claim> claimMap = JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token).getClaims(); if (claimMap == null){ return null; } Map<String, Object> loadMap = new HashMap<>(); claimMap.forEach((k, v) -> { Object obj = null; if (v.asString() != null) { obj = v.asString(); } else if (v.asBoolean() != null) { obj = v.asBoolean(); } else if (v.asDate() != null || v.asLong() != null) {//Date類型按Long方式來處理 obj = v.asLong(); } else if (v.asInt() != null) { obj = v.asInt(); } loadMap.put(k, obj); }); return loadMap; } //測試方法 //登錄成功后,將用戶的id放入到JwtTokenUtils.createToken(userid, 60 * 30); //每次請求在攔截器或過濾器中,獲取請求中的token調用JwtTokenUtils.parseToken(jwtToken)驗證是否有效,或從token中獲取userid進行業務邏輯操作 public static void main(String[] args) { //創建token和解析token String subject = "userid_001"; System.out.println("新建subject = " + subject); String jwtToken = JwtTokenUtils.createToken(subject, 60); System.out.println("生成token = " + jwtToken); try { subject = JwtTokenUtils.parseToken(jwtToken); System.out.println("解析subject = " + subject); } catch(TokenExpiredException tee){ throw new TokenExpiredException("token已過有效期,請重新申請:" + tee.getMessage()); } catch(SignatureVerificationException sve){ //驗證簽名不通過(數據被篡改過) throw sve; } //過期測試 // String jwtToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyaWRfMDAxIiwiaXNzIjoicHJvLXNlcnZlciIsImV4cCI6MTU2NTI0OTMxMH0.0cSnHLHTqDx-FXoL08yk6AtIwobiWcMNRofyE4dunGY"; // subject = JwtTokenUtils.parseToken(jwtToken); //無效驗鑒(將最后一位更改為z) // String jwtToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyaWRfMDAxIiwiaXNzIjoicHJvLXNlcnZlciIsImV4cCI6MTU2NTI0OTMxMH0.0cSnHLHTqDx-FXoL08yk6AtIwobiWcMNRofyE4dunGz"; // subject = JwtTokenUtils.parseToken(jwtToken); //將多種數據放入集合中,通過jwt創建token /* Map<String, Object> loadMap = new HashMap<>(); loadMap.put("userId", (Long) 1000000L); loadMap.put("userName", "test"); loadMap.put("isLogin", true); String jwtToken = JwtTokenUtils.createToken(loadMap, 60); System.out.println(jwtToken); Map<String, Object> loadMap2 = JwtTokenUtils.parseTokenToMap(jwtToken); for (Map.Entry<String, Object> entry : loadMap2.entrySet()) { System.out.println(entry.getKey() + "=" + entry.getValue()); } */ } }
請求中集成使用
1.登錄成功后,將用戶的id放入到JwtTokenUtils.createToken(userid, 60 * 30);
2.對需要鑒權的每次URL請求在攔截器或過濾器中處理,獲取請求中的token(一般放在請求頭部,每次請求必帶)調用JwtTokenUtils.parseToken(jwtToken)驗證是否有效,或從token中獲取userid進行業務邏輯操作
到此,相信大家對“JAVA中JWT怎么創建token”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。