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

Java中JWT令牌實現(xiàn)登錄驗證

 更新時間:2024年12月30日 10:12:09   作者:水冠7  
本文主要介紹了JWT令牌在Java中實現(xiàn)登錄驗證的方法,JWT是一種自我包含的、無狀態(tài)的認證機制,可以用來在客戶端和服務器之間傳遞安全可靠的信息,感興趣的可以了解一下

1.實現(xiàn)登錄驗證的引出

傳統(tǒng)思路下:

  • 登錄頁面把用戶名和密碼交給服務器。
  • 服務器驗證用戶名和密碼是否正確,并返回校驗結(jié)果給后端。
  • 如果密碼正確,就會在服務器創(chuàng)建Session,通過Cookie把sessionId返回給客戶端。

原因

但是在集群環(huán)境下,無法直接使用Session。因為如果只部署在一臺機器時,容易發(fā)生單點故障(一旦這臺服務器掛了,整個應用就無法訪問),所以通常情況下,一個Web應用會部署在多個服務器上,通過Nginx等進行負載均衡。此時,來自一個用戶的請求就會分發(fā)到不同的服務器上。

在這里插入圖片描述

  • 使用Session時:

    用戶登錄: 用戶登錄請求,經(jīng)過負載均衡發(fā)送給服務器1,服務器1進行用戶名和密碼驗證,驗證成功后,把Session存在了服務器1上。

    查詢操作:用戶登錄之后,攜帶Cookie(里面帶有SessionId)繼續(xù)執(zhí)行查詢操作,假如進行查詢博客列表,此時請求經(jīng)過負載均衡發(fā)到服務器2上,服務器2會先通過SessionId驗證用戶是否登錄,此時第二臺機器上沒有該用戶的Session,即出現(xiàn)查詢不了的問題。

在這里插入圖片描述

2.JWT令牌

JWT全稱:JSON Web Token,用于客戶端和服務器之間傳遞安全可靠的信息,本質(zhì)是一個token,也叫token,令牌的本質(zhì)就是一個字符串。相當于現(xiàn)在人們的身份證,出門在外驗證身份的時候,拿出身份證即可。

2.1 使用JWT令牌時

  • 用戶登錄 : 用戶登錄請求,經(jīng)過負載均衡,把請求發(fā)給服務器1,服務器1進行賬號密碼驗證,驗證成功之后,生成一個令牌,并返回給客戶端。
  • 客戶端收到令牌時,把令牌存儲起來,可以存儲在Cookie中,也可以存儲在其它的存儲空間,典型的如(localStorage)
  • 查詢操作 用戶登錄之后,攜帶令牌繼續(xù)執(zhí)行查詢操作,假如查詢博客列表,此時請求經(jīng)過負載均衡發(fā)到服務器2,服務器2先進行權(quán)限驗證操作。服務器驗證令牌是否有效,如果有效,說明用戶已經(jīng)執(zhí)行了登錄操作,如果無效,說明用戶之前未執(zhí)行登錄操作。

在這里插入圖片描述

2.2 令牌的組成

令牌官網(wǎng)所示,token,本質(zhì)上一個字符串中間使用 符號 點 . 來分割,令牌由三部分組成,header、payload和verify signature。

在這里插入圖片描述

  • 第一部分:Header(頭),令牌的類型和使用的簽名算法,如"alg": “HS256(哈希算法)”, “typ”: “JWT”。

  • 第二部分:Payload(負載),存放一些有效的信息(自定義信息,默認信息)如{“id”:“1”,“username”:“zhangsan”},還存在JWT提供的現(xiàn)場字段,如過期時間戳等。

  • 第三部分:Signature(簽名),防止token被篡改,確保安全性

    簽名的目的就是為了防止token被篡改,而正因為token最后一個部分簽名存在,
    所以整個token是非常安全可靠的,一旦token當中的任何一部分被修改,
    整個token在校驗的時候都會失敗。 
    

3. JWT令牌(token)生成和校驗

3.1 引入JWT令牌的依賴

  • 在pom.xml文件中引入依賴
<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-api -->
		<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>

3.2 使用Jar包中提供的API來實現(xiàn)JWT令牌的生成和校驗

  • 生成token之后,獲取token進行解析,創(chuàng)建解釋器,設置簽名密鑰,如果解析token的claims內(nèi)容不為null,說明校驗成功,否則失敗。
package com.example.blog.utils;

import com.example.blog.constant.Constants;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtParser;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.io.Encoders;
import io.jsonwebtoken.security.Keys;
import lombok.extern.slf4j.Slf4j;

import javax.crypto.SecretKey;
import java.security.Key;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Slf4j
public class JwtUtils {
    // JWT過期時間
    public static final long JWT_EXPIRATION = 60*60*60*1000;
    // 生成key
    private static final String secretStr = "DuJXRS2W3AJHqyFhAplBmsPNawnEdFYFNmlNdMbyU9w=";
    private static final Key key = Keys.hmacShaKeyFor(Decoders.BASE64.decode(secretStr));

    /**
     *  生成token
     */
    public static String genJwtToken(Map<String,Object> claim) {
        String token = Jwts.builder().setClaims(claim)
                .setExpiration(new Date(System.currentTimeMillis()+JWT_EXPIRATION))
                .signWith(key)
                .compact();
        return token;
    }


    /**
     *  校驗token
     *  Claims 為空,表示jwt校驗失敗
     *
     */
    public static Claims parseToken(String token) {
        // 創(chuàng)建解析器,設置簽名密鑰
        JwtParser build = Jwts.parserBuilder().setSigningKey(key).build();
        Claims claims = null;
        try {
            // 解析token
            claims = build.parseClaimsJws(token).getBody();
        }catch (Exception e){
            log.error("解析token失敗,token:{}",token);
            return null;
        }
        return claims;
    }
}

3.3 使用JWT令牌驗證登錄

在這里插入圖片描述

3.4 令牌的優(yōu)缺點

  • 優(yōu)點:
    • 解決了集群環(huán)境下認證的問題
    • 不需要在服務器端存儲,從而減輕了服務器的存儲壓力
  • 缺點:
    • 需要自己實現(xiàn)令牌的生成、傳遞、校驗

到此這篇關(guān)于Java中JWT令牌實現(xiàn)登錄驗證的文章就介紹到這了,更多相關(guān)Java JWT令牌登錄驗證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • java接入創(chuàng)藍253短信驗證碼的實例講解

    java接入創(chuàng)藍253短信驗證碼的實例講解

    下面小編就為大家分享一篇java接入創(chuàng)藍253短信驗證碼的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • Java中讀取配置文件的示例詳解

    Java中讀取配置文件的示例詳解

    這篇文章主要為大家詳細介紹了Java中讀取配置文件properties的相關(guān)方法,文中的示例代碼簡潔易懂,感興趣的小伙伴快跟隨小編一起學習一下吧
    2023-10-10
  • Springboot整合Freemarker的實現(xiàn)詳細過程

    Springboot整合Freemarker的實現(xiàn)詳細過程

    這篇文章主要介紹了Springboot整合Freemarker的實現(xiàn)詳細過程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • SpringBoot集成quartz實現(xiàn)定時任務詳解

    SpringBoot集成quartz實現(xiàn)定時任務詳解

    最為常用定時任務框架是Quartz,并且Spring也集成了Quartz的框架,Quartz不僅支持單實例方式還支持分布式方式。本文主要介紹Quartz,基礎的Quartz的集成案例本,以及實現(xiàn)基于數(shù)據(jù)庫的分布式任務管理和控制job生命周期
    2022-08-08
  • springboot修改端口號的實現(xiàn)方式

    springboot修改端口號的實現(xiàn)方式

    文章介紹了如何在Spring Boot項目中修改默認端口號,通過在`application.properties`或`application.yml`文件中添加`server.port=端口號`來實現(xiàn)
    2026-01-01
  • Java將CSV的數(shù)據(jù)發(fā)送到kafka的示例

    Java將CSV的數(shù)據(jù)發(fā)送到kafka的示例

    這篇文章主要介紹了Java將CSV的數(shù)據(jù)發(fā)送到kafka得示例,幫助大家更好得理解和使用Java,感興趣的朋友可以了解下
    2020-11-11
  • 詳解Java線程池和Executor原理的分析

    詳解Java線程池和Executor原理的分析

    這篇文章主要介紹了詳解Java線程池和Executor原理的分析的相關(guān)資料,這里提供實例及分析原理幫助大家理解這部分知識,需要的朋友可以參考下
    2017-07-07
  • SpringBoot和Tomcat的關(guān)系解讀

    SpringBoot和Tomcat的關(guān)系解讀

    這篇文章主要介紹了SpringBoot和Tomcat的關(guān)系,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • SystemServer進程啟動過程解析

    SystemServer進程啟動過程解析

    這篇文章主要為大家介紹了SystemServer進程啟動過程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Java基于ReadWriteLock實現(xiàn)鎖的應用

    Java基于ReadWriteLock實現(xiàn)鎖的應用

    這篇文章主要介紹了Java基于ReadWriteLock實現(xiàn)鎖的應用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10

最新評論

平江县| 翁牛特旗| 漳州市| 阳原县| 澄江县| 桐庐县| 伽师县| 凤台县| 南召县| 资中县| 宣威市| 甘孜| 峡江县| 杭锦旗| 十堰市| 蒲江县| 子洲县| 屏东市| 平山县| 潞城市| 广宗县| 外汇| 望都县| 棋牌| 舞钢市| 嵊泗县| 蛟河市| 永清县| 新建县| 乡宁县| 宜春市| 韩城市| 珠海市| 苏尼特左旗| 永安市| 清原| 金阳县| 龙口市| 漯河市| 历史| 葫芦岛市|