91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JAVA中JWT怎么創建token

發布時間:2021-11-17 11:40:17 來源:億速云 閱讀:158 作者:iii 欄目:大數據

本篇內容主要講解“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”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

德清县| 新巴尔虎左旗| 平阳县| 达州市| 岑巩县| 乾安县| 闸北区| 沙河市| 肥乡县| 古丈县| 宁阳县| 莫力| 遵义市| 仪征市| 武清区| 揭东县| 四子王旗| 梓潼县| 东城区| 桃江县| 廊坊市| 金门县| 临桂县| 宜兰县| 西城区| 东港市| 通道| 城步| 涪陵区| 荆门市| 禹城市| 望都县| 台南市| 威远县| 长春市| 临猗县| 贵港市| 稻城县| 鸡西市| 唐河县| 静乐县|