SpringBoot實(shí)現(xiàn)登錄校驗(yàn)(JWT令牌)
??簡述JWT令牌
JWT全稱為JSON Web Token,是一種用于身份驗(yàn)證的開放標(biāo)準(zhǔn)。它是一個(gè)基于JSON格式的安全令牌,主要用于在網(wǎng)絡(luò)上傳輸聲明或者用戶身份信息。JWT通常被用作API的認(rèn)證方式,以及跨域身份驗(yàn)證。
JWT令牌由三部分組成,分別是頭部(Header)、載荷(Payload)和簽名(Signature)。頭部包含了令牌使用的加密算法信息,載荷包含了所需傳輸?shù)挠脩粜畔ⅲ灻糜诒WC令牌的完整性和真實(shí)性,防止令牌被篡改。


官網(wǎng)https://jwt.io/
?JWT特點(diǎn)
- 可以跨語言、跨平臺(tái)使用,因?yàn)樗腔贘SON標(biāo)準(zhǔn)的。
- 可以直接嵌入到HTTP請求頭中,方便傳輸和驗(yàn)證。
- 令牌的有效期可以通過設(shè)置過期時(shí)間來進(jìn)行控制,提高了安全性。
- 由于令牌中包含了用戶信息,因此可以避免頻繁查詢數(shù)據(jù)庫的情況出現(xiàn),提高了系統(tǒng)的性能。
??JWT使用流程
用戶向服務(wù)器發(fā)送登錄請求,服務(wù)器進(jìn)行身份驗(yàn)證,如果驗(yàn)證成功則返回一個(gè)JWT令牌給客戶端。
客戶端收到JWT令牌后,將其保存在本地。每次向服務(wù)器發(fā)送請求時(shí),在請求的頭部中攜帶該令牌,以便服務(wù)器對請求進(jìn)行身份驗(yàn)證。
服務(wù)器收到請求后,從請求頭中提取JWT令牌,并進(jìn)行解析和驗(yàn)證。如果令牌有效,則允許請求繼續(xù)執(zhí)行;否則返回錯(cuò)誤信息。
生成令牌,校驗(yàn)令牌

在服務(wù)端攔截所有的請求,判斷算法有合法的jwt請求,如果有,直接放行,否則進(jìn)行攔截
JWT令牌代碼實(shí)現(xiàn)
我把代碼腳手架傳到網(wǎng)盤里面了,大家跟著代碼來學(xué)習(xí)
源碼地址:management_jb51.rar
添加依賴
<!-- JWT令牌-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
生成JWT令牌
//生成jwt
@Test
public void testGenJwt(){
Map<String, Object> claims = new HashMap<>();
claims.put("id",1);
claims.put("name","Tom");
String jwt = Jwts.builder()
.signWith(SignatureAlgorithm.HS512, "itheima") //簽名算法
.setClaims(claims) //自定義內(nèi)容
//有參構(gòu)造方法
.setExpiration(new Date(System.currentTimeMillis()+3600)) //令牌過期時(shí)間
.compact();
System.out.println(jwt);
}

運(yùn)行后發(fā)現(xiàn),出現(xiàn)了jwt令牌

我們把這一段jwt令牌復(fù)制粘貼到j(luò)wt官網(wǎng)進(jìn)行解析一下

解析jwt令牌
(相當(dāng)于校驗(yàn)令牌,只要解析令牌不報(bào)錯(cuò),就相當(dāng)于校驗(yàn)jwt令牌正確)
//解析jwt
@Test
public void testParseJwt() {
Claims claims=Jwts.parser()
.setSigningKey("itheima")
//寫入你剛才運(yùn)行出來的jwt令牌
.parseClaimsJws("eyJhbGciOiJIUzUxMiJ9.eyJuYW1lIjoiVG9tIiwiaWQiOjEsImV4cCI6MTcwMDcyMzQ1M30.GMp1Z-osnaOJ08nM3uswPKRFIaKS4e6_UvZXq2Q4QjYBFRcJNk7WgQRkFJHXIUrZfKovXUZhd8-OOKtXYDyrbg")
.getBody();
System.out.println(claims);
}

解析出來了

可能會(huì)發(fā)生這種報(bào)錯(cuò),是因?yàn)閖wt令牌過期了,重新生成一個(gè)即可

??JWT應(yīng)用
我們接著上面的代碼寫,引入jwt工具類

package com.itheima.utils;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;
public class JwtUtils {
private static String signKey = "itheima"; //簽名密鑰
private static Long expire = 43200000L; //過期時(shí)間
/**
* 生成JWT令牌
* @param claims JWT第二部分負(fù)載 payload 中存儲(chǔ)的內(nèi)容
* @return
*/
public static String generateJwt(Map<String, Object> claims){
String jwt = Jwts.builder()
.addClaims(claims)
.signWith(SignatureAlgorithm.HS256, signKey)
.setExpiration(new Date(System.currentTimeMillis() + expire))
.compact();
return jwt;
}
/**
* 解析JWT令牌
* @param jwt JWT令牌
* @return JWT第二部分負(fù)載 payload 中存儲(chǔ)的內(nèi)容
*/
public static Claims parseJWT(String jwt){
Claims claims = Jwts.parser()
.setSigningKey(signKey)
.parseClaimsJws(jwt)
.getBody();
return claims;
}
}
創(chuàng)建LoginController,里面包含了生成jwt令牌的代碼

package com.itheima.controller;
import com.itheima.pojo.Emp;
import com.itheima.pojo.Result;
import com.itheima.service.EmpService;
import com.itheima.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@RestController
public class LoginController {
@Autowired
private EmpService empService;
@PostMapping("/login")
public Result login(@RequestBody Emp emp){
log.info("員工登錄: {}", emp);
Emp e = empService.login(emp);
//登錄成功,生成令牌,下發(fā)令牌
if (e != null){
Map<String, Object> claims = new HashMap<>();
claims.put("id", e.getId());
claims.put("name", e.getName());
claims.put("username", e.getUsername());
String jwt = JwtUtils.generateJwt(claims); //jwt包含了當(dāng)前登錄的員工信息
return Result.success(jwt);
}
//登錄失敗, 返回錯(cuò)誤信息
return Result.error("用戶名或密碼錯(cuò)誤");
}
}到此這篇關(guān)于SpringBoot實(shí)現(xiàn)登錄校驗(yàn)(JWT令牌)的文章就介紹到這了,更多相關(guān)SpringBoot 登錄校驗(yàn) 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)簡單井字棋小游戲代碼實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)簡單井字棋小游戲代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
詳解如何在SpringBoot項(xiàng)目中使用全局異常處理
在完整的項(xiàng)目開發(fā)中,異常的出現(xiàn)幾乎是無法避免的;如果凡是有可能出現(xiàn)異常的地方,我們都手動(dòng)的使用try-catch將其捕獲的話,會(huì)使得代碼顯得十分臃腫并且后期不好維護(hù)。本文介紹了pringBoot項(xiàng)目中使用全局異常處理的方法,需要的可以參考一下2022-10-10
SpringBoot使用Jwt處理跨域認(rèn)證問題的教程詳解
這篇文章主要介紹了SpringBoot使用Jwt處理跨域認(rèn)證問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
IDEA:Error running,Command line is too&n
這篇文章主要介紹了IDEA:Error running,Command line is too long.解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
idea創(chuàng)建項(xiàng)目沒有webapp文件夾的解決方法
本文主要介紹了idea創(chuàng)建項(xiàng)目沒有webapp文件夾的解決方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
jsp頁面中獲取servlet請求中的參數(shù)的辦法詳解
在JAVA WEB應(yīng)用中,如何獲取servlet請求中的參數(shù),本文講解了jsp頁面中獲取servlet請求中的參數(shù)的辦法2018-03-03

