最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

通過JWT來解決登錄認(rèn)證問題的方案

 更新時間:2024年12月13日 09:44:37   作者:2的n次方_  
Json web token (JWT),是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標(biāo)準(zhǔn)((RFC7519),該token被設(shè)計為緊湊且安全的,特別適用于分布式站點的單點登錄(SSO)場景,本文給大家介紹了如何通過 JWT 來解決登錄認(rèn)證問題,需要的朋友可以參考下

1. 問題引入

在登錄功能的實現(xiàn)中

傳統(tǒng)思路:

登錄頁面時把用戶名和密碼提交給服務(wù)器服務(wù)器驗證用戶名和密碼,并把檢驗結(jié)果返回給后端如果密碼正確,則在服務(wù)器端創(chuàng)建 session,通過 cookie 把 session id 返回給瀏覽器

但是正常情況下一個 web 應(yīng)用是部署到多個服務(wù)器上的,通過 Nginx 等進(jìn)行負(fù)載均衡,此時就可能出現(xiàn)這樣的情況:用戶登錄請求之后把 session 存儲在了第一臺服務(wù)器上,但是后續(xù)的請求操作,例如查詢等,就可能會轉(zhuǎn)發(fā)到第二臺服務(wù)器上,但是第二臺服務(wù)器沒有存儲該用戶的 session,就會讓用戶重新登錄,這肯定是不合理的

解決方案:

對于服務(wù)端來說,上述出現(xiàn)的問題是由于 session 是默認(rèn)存儲在內(nèi)存中的,服務(wù)器重啟之后,session 就丟失了,如果把 session 存儲在 Redis 中,那么就能共同訪問,并且不丟失數(shù)據(jù)。第二種方案就是引入 token,也就是令牌,用戶登錄之后,服務(wù)器對賬號和密碼進(jìn)行驗證,驗證通過就生成一個令牌,并返回給客戶端,客戶端收到令牌之后,把令牌存儲起來,之后再發(fā)起其他請求就帶著令牌,處理請求的服務(wù)器校驗令牌是否有效即可

引入令牌之后就解決了集群環(huán)境下的認(rèn)證問題,并且減輕了服務(wù)器的存儲壓力,令牌由客戶端存儲,服務(wù)器只負(fù)責(zé)生成和校驗

2. JWT 的介紹

官網(wǎng):JSON Web Tokens - jwt.io

JWT 令牌本身是一個字符串,包括頭部,載荷,簽名三部分,將信息作為 JSON 對象進(jìn)行傳輸

頭部:包括令牌的類型和使用的哈希算法

載荷:存儲的有效信息,為自定義內(nèi)容

簽名:用于防止 JWT 內(nèi)容被篡改(并不是防止被解析),只要被篡改,令牌就會失效

3. JWT 的使用

首先需要導(dǎo)入對應(yīng)的依賴:

<dependency>
  <groupId>io.jsonwebtoken</groupId>
  <artifactId>jjwt-api</artifactId>
  <version>0.11.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-impl -->
<dependency>
  <groupId>io.jsonwebtoken</groupId>
  <artifactId>jjwt-impl</artifactId>
  <version>0.11.5</version>
  <scope>runtime</scope>
</dependency>
<dependency>
  <groupId>io.jsonwebtoken</groupId>
  <artifactId>jjwt-jackson</artifactId> <!-- or jjwt-gson if Gson is preferred -->
  <version>0.11.5</version>
  <scope>runtime</scope>
</dependency>

接下來就可以測試生成 token 了

//生成token
@Test
public void getToken() {
    String secret = "abcdefghijklmnopqrstuvwxyz";
    //設(shè)置key,用于簽名
    Key key = Keys.hmacShaKeyFor(Decoders.BASE64.decode(secret));
    //載荷
    Map<String, Object> map = new HashMap<>();
    map.put("name", "zhangsan");
    map.put("id", 1);
    //生成token
    String compact = Jwts.builder().setClaims(map).signWith(key).compact();
    System.out.println(compact);
}

此時報出了一個錯誤,要求使用提供的方法來生成 key

接下來看怎么生成 key

@Test
public void genKey(){
    //生成key
    SecretKey secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256);
    //轉(zhuǎn)化為String類型
    String enconde = Encoders.BASE64.encode(secretKey.getEncoded());
    System.out.println(enconde);
}

生成之后就可以替換掉原來自定義的字符串了,再去生成 token

在官網(wǎng)中也是可以校驗成功的

接下來看怎么通過方法來進(jìn)行 token 的校驗:

//校驗token
@Test
public void parseToken(){
    String token = "eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiemhhbmdzYW4iLCJpZCI6MX0.xllreml0yt9aQDXSQe0ngQb45VpV5843rOEKdDQ4QCk";
    //JWT解析器
    JwtParser build = Jwts.parserBuilder().setSigningKey(key).build();
    //對創(chuàng)建好的token進(jìn)行解析
    Object body = build.parse(token).getBody();
    System.out.println(body);
}

如果說簽名錯了就無法正確解析了:

這就可以通過 try- catch 進(jìn)行邏輯處理了:

根據(jù)這些就可以寫一個工具類,服務(wù)端就可以直接調(diào)用了

@Slf4j
public class JwtUtil {
    //設(shè)置key,用于簽名
    private final static String secret = "WHMgtn1tTrIxc00ys17ukp65bf2KZ0wrihyqynY18F8=sssss";
    private final static Key key = Keys.hmacShaKeyFor(Decoders.BASE64.decode(secret));
    private final static long expiration = 24 * 60 * 60 * 1000;
 
    //生成token
    public static String getToken(Map<String, Object> map) {
        return Jwts.builder()
        .setClaims(map)
        .setExpiration(new Date(System.currentTimeMillis() + expiration))//設(shè)置過期時間
        .setIssuedAt(new Date())  //設(shè)置簽發(fā)日期
        .signWith(key)
        .compact();
    }
 
    //校驗token
    public static Claims parseToken(String token) {
        if (!StringUtils.hasLength(token)) {
            return null;
        }
        //JWT解析器
        JwtParser build = Jwts.parserBuilder().setSigningKey(key).build();
        //對創(chuàng)建好的token進(jìn)行解析
        Claims body = null;
        try {
            body = build.parseClaimsJws(token).getBody();
            return body;
        } catch (SignatureException e) {
            log.error("token非法...e{}", e.getMessage());
        } catch (ExpiredJwtException e) {
            log.error("token過期... e{}", e.getMessage());
        } catch (Exception e) {
            log.error("token解析失敗,e{}", e.getMessage());
        }
        return body;
    }
}

以上就是通過JWT來解決登錄認(rèn)證問題的方案的詳細(xì)內(nèi)容,更多關(guān)于JWT登錄認(rèn)證問題的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java的線程阻塞、中斷及優(yōu)雅退出方法詳解

    Java的線程阻塞、中斷及優(yōu)雅退出方法詳解

    這篇文章主要介紹了Java的線程阻塞、中斷及優(yōu)雅退出方法詳解,Java中的線程阻塞是指當(dāng)一個線程無法繼續(xù)執(zhí)行時,它會進(jìn)入阻塞狀態(tài),直到某個條件滿足后才能繼續(xù)執(zhí)行,線程阻塞可以通過多種方式實現(xiàn),需要的朋友可以參考下
    2023-10-10
  • Springboot自定義mvc組件如何實現(xiàn)

    Springboot自定義mvc組件如何實現(xiàn)

    這篇文章主要介紹了Springboot自定義mvc組件如何實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • JavaWeb實體類轉(zhuǎn)為json對象的實現(xiàn)方法

    JavaWeb實體類轉(zhuǎn)為json對象的實現(xiàn)方法

    這篇文章主要介紹了JavaWeb實體類轉(zhuǎn)為json對象的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Java之InputStreamReader類的實現(xiàn)

    Java之InputStreamReader類的實現(xiàn)

    這篇文章主要介紹了Java之InputStreamReader類的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • EasyExcel工具讀取Excel空數(shù)據(jù)行問題的解決辦法

    EasyExcel工具讀取Excel空數(shù)據(jù)行問題的解決辦法

    EasyExcel是阿里巴巴開源的一個excel處理框架,以使用簡單,節(jié)省內(nèi)存著稱,下面這篇文章主要給大家介紹了關(guān)于EasyExcel工具讀取Excel空數(shù)據(jù)行問題的解決辦法,需要的朋友可以參考下
    2022-08-08
  • IntelliJ IDEA2020.3詳細(xì)安裝教程

    IntelliJ IDEA2020.3詳細(xì)安裝教程

    這篇文章主要介紹了IntelliJ IDEA2020.3詳細(xì)安裝教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • java反射調(diào)用get/set方法實現(xiàn)

    java反射調(diào)用get/set方法實現(xiàn)

    本文文章介紹了在Java中使用反射調(diào)用get/set方法時,如何通過Introspector和PropertyDescriptor來更優(yōu)雅地處理,下面就來詳細(xì)的介紹一下,感興趣的可以了解一下
    2025-12-12
  • Java中CountDownLatch用法解析

    Java中CountDownLatch用法解析

    這篇文章主要為大家詳細(xì)介紹了Java中CountDownLatch用法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Java設(shè)計模式之裝飾模式詳解

    Java設(shè)計模式之裝飾模式詳解

    這篇文章主要介紹了Java設(shè)計模式中的裝飾者模式,裝飾者模式即Decorator Pattern,裝飾模式是在不必改變原類文件和使用繼承的情況下,動態(tài)地擴展一個對象的功能,裝飾模式又名包裝模式。裝飾器模式以對客戶端透明的方式拓展對象的功能,是繼承關(guān)系的一種替代方案
    2022-08-08
  • 分享Java常用開發(fā)編輯器工具

    分享Java常用開發(fā)編輯器工具

    這篇文章主要給大家分享了分享Java常用開發(fā)編輯器工具,文章內(nèi)容介紹非常詳細(xì),具有很大的參考價值,需要的小伙伴可以參考一下,希望對你的工作或?qū)W習(xí)有一定的幫助
    2022-03-03

最新評論

洱源县| 德江县| 钟祥市| 金湖县| 汨罗市| 克拉玛依市| 康马县| 肃北| 堆龙德庆县| 新巴尔虎左旗| 海盐县| 岳普湖县| 礼泉县| 金塔县| 常宁市| 全州县| 法库县| 沾益县| 扬州市| 周至县| 阜宁县| 那坡县| 宣恩县| 许昌县| 游戏| 阜阳市| 云阳县| 玛纳斯县| 会昌县| 曲靖市| 陵川县| 安义县| 井研县| 鸡西市| 广丰县| 河源市| 镇赉县| 汝州市| 沙雅县| 卢氏县| 广宁县|