欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

傳統(tǒng)思路下:

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

原因

但是在集群環(huán)境下,無法直接使用Session。因?yàn)槿绻徊渴鹪谝慌_(tái)機(jī)器時(shí),容易發(fā)生單點(diǎn)故障(一旦這臺(tái)服務(wù)器掛了,整個(gè)應(yīng)用就無法訪問),所以通常情況下,一個(gè)Web應(yīng)用會(huì)部署在多個(gè)服務(wù)器上,通過Nginx等進(jìn)行負(fù)載均衡。此時(shí),來自一個(gè)用戶的請(qǐng)求就會(huì)分發(fā)到不同的服務(wù)器上。

在這里插入圖片描述

  • 使用Session時(shí):

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

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

在這里插入圖片描述

2.JWT令牌

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

2.1 使用JWT令牌時(shí)

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

在這里插入圖片描述

2.2 令牌的組成

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

在這里插入圖片描述

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

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

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

    簽名的目的就是為了防止token被篡改,而正因?yàn)閠oken最后一個(gè)部分簽名存在,
    所以整個(gè)token是非常安全可靠的,一旦token當(dāng)中的任何一部分被修改,
    整個(gè)token在校驗(yàn)的時(shí)候都會(huì)失敗。 
    

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

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來實(shí)現(xiàn)JWT令牌的生成和校驗(yàn)

  • 生成token之后,獲取token進(jìn)行解析,創(chuàng)建解釋器,設(shè)置簽名密鑰,如果解析token的claims內(nèi)容不為null,說明校驗(yàn)成功,否則失敗。
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過期時(shí)間
    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;
    }


    /**
     *  校驗(yàn)token
     *  Claims 為空,表示jwt校驗(yàn)失敗
     *
     */
    public static Claims parseToken(String token) {
        // 創(chuàng)建解析器,設(shè)置簽名密鑰
        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令牌驗(yàn)證登錄

在這里插入圖片描述

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

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

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

相關(guān)文章

  • HttpClient的DnsResolver自定義DNS解析另一種選擇深入研究

    HttpClient的DnsResolver自定義DNS解析另一種選擇深入研究

    這篇文章主要為大家介紹了HttpClient的DnsResolver自定義DNS解析另一種選擇深入研究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Springboot如何實(shí)現(xiàn)代理服務(wù)器

    Springboot如何實(shí)現(xiàn)代理服務(wù)器

    這篇文章主要介紹了Springboot如何實(shí)現(xiàn)代理服務(wù)器問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • java使用smslib連接短信貓發(fā)送短信代碼分享

    java使用smslib連接短信貓發(fā)送短信代碼分享

    這篇文章主要介紹了java使用smslib連接短信貓發(fā)關(guān)短信代碼,需要的朋友可以參考下
    2014-02-02
  • idea maven編譯報(bào)錯(cuò)Java heap space的解決方法

    idea maven編譯報(bào)錯(cuò)Java heap space的解決方法

    這篇文章主要為大家詳細(xì)介紹了idea maven編譯報(bào)錯(cuò)Java heap space的相關(guān)解決方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-04-04
  • IDEA 2020 2全家桶安裝激活超詳細(xì)圖文教程

    IDEA 2020 2全家桶安裝激活超詳細(xì)圖文教程

    這篇文章主要介紹了IDEA-2020-2 全家桶安裝激活超詳細(xì)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • mac系統(tǒng)如何下載和安裝jdk的三種方式

    mac系統(tǒng)如何下載和安裝jdk的三種方式

    這篇文章主要介紹了mac系統(tǒng)下載和安裝jdk的三種方式,每種方法都有其特點(diǎn),如安裝來源及可靠性、安裝過程及便捷性、版本管理及切換、環(huán)境配置、jdk默認(rèn)安裝路徑以及占用空間及資源管理等,需要的朋友可以參考下
    2025-01-01
  • 新手初學(xué)Java常見排序算法

    新手初學(xué)Java常見排序算法

    排序(Sorting) 是計(jì)算機(jī)程序設(shè)計(jì)中的一種重要操作,它的功能是將一個(gè)數(shù)據(jù)元素(或記錄)的任意序列,重新排列成一個(gè)關(guān)鍵字有序的序列
    2021-07-07
  • Java Calendar類使用總結(jié)及使用實(shí)例

    Java Calendar類使用總結(jié)及使用實(shí)例

    這篇文章主要介紹了Java Calendar類使用總結(jié)及使用實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 如何解決getReader() has already been called for this request問題

    如何解決getReader() has already been called&

    這篇文章主要介紹了如何解決getReader() has already been called for this request問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • springboot項(xiàng)目部署到寶塔的詳細(xì)圖文教程

    springboot項(xiàng)目部署到寶塔的詳細(xì)圖文教程

    網(wǎng)上關(guān)于寶塔運(yùn)行springBoot的東西說有點(diǎn)迷糊,但是有一句話很重要,Spring boot項(xiàng)目只需要JDK環(huán)境即可部署成功,下面這篇文章主要給大家介紹了關(guān)于springboot項(xiàng)目部署到寶塔的詳細(xì)圖文教程,需要的朋友可以參考下
    2023-05-05

最新評(píng)論