
??簡(jiǎn)述JWT令牌
JWT全稱為JSON Web Token,是一種用于身份驗(yàn)證的開(kāi)放標(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)
- 可以跨語(yǔ)言、跨平臺(tái)使用,因?yàn)樗腔贘SON標(biāo)準(zhǔn)的。
- 可以直接嵌入到HTTP請(qǐng)求頭中,方便傳輸和驗(yàn)證。
- 令牌的有效期可以通過(guò)設(shè)置過(guò)期時(shí)間來(lái)進(jìn)行控制,提高了安全性。
- 由于令牌中包含了用戶信息,因此可以避免頻繁查詢數(shù)據(jù)庫(kù)的情況出現(xiàn),提高了系統(tǒng)的性能。
??JWT使用流程
用戶向服務(wù)器發(fā)送登錄請(qǐng)求,服務(wù)器進(jìn)行身份驗(yàn)證,如果驗(yàn)證成功則返回一個(gè)JWT令牌給客戶端。
客戶端收到JWT令牌后,將其保存在本地。每次向服務(wù)器發(fā)送請(qǐng)求時(shí),在請(qǐng)求的頭部中攜帶該令牌,以便服務(wù)器對(duì)請(qǐng)求進(jìn)行身份驗(yàn)證。
服務(wù)器收到請(qǐng)求后,從請(qǐng)求頭中提取JWT令牌,并進(jìn)行解析和驗(yàn)證。如果令牌有效,則允許請(qǐng)求繼續(xù)執(zhí)行;否則返回錯(cuò)誤信息。
生成令牌,校驗(yàn)令牌在服務(wù)端攔截所有的請(qǐng)求,判斷算法有合法的jwt請(qǐng)求,如果有,直接放行,否則進(jìn)行攔截
??JWT令牌代碼實(shí)現(xiàn)
我把代碼腳手架傳到網(wǎng)盤里面了,大家跟著代碼來(lái)學(xué)習(xí)
我用夸克網(wǎng)盤分享了「tlias-web-management」,點(diǎn)擊鏈接即可保存。
鏈接:https://pan.quark.cn/s/1f4f6c129be8
添加依賴
<!-- 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)) //令牌過(guò)期時(shí)間
.compact();
System.out.println(jwt);
}
運(yùn)行后發(fā)現(xiàn),出現(xiàn)了jwt令牌
我們把這一段jwt令牌復(fù)制粘貼到j(luò)wt官網(wǎng)進(jìn)行解析一下
https://jwt.io/
解析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)行出來(lái)的jwt令牌
.parseClaimsJws("eyJhbGciOiJIUzUxMiJ9.eyJuYW1lIjoiVG9tIiwiaWQiOjEsImV4cCI6MTcwMDcyMzQ1M30.GMp1Z-osnaOJ08nM3uswPKRFIaKS4e6_UvZXq2Q4QjYBFRcJNk7WgQRkFJHXIUrZfKovXUZhd8-OOKtXYDyrbg")
.getBody();
System.out.println(claims);
}
解析出來(lái)了
可能會(huì)發(fā)生這種報(bào)錯(cuò),是因?yàn)閖wt令牌過(guò)期了,重新生成一個(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; //過(guò)期時(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ò)誤");
}
}
在技術(shù)的道路上,我們不斷探索、不斷前行,不斷面對(duì)挑戰(zhàn)、不斷突破自我??萍嫉陌l(fā)展改變著世界,而我們作為技術(shù)人員,也在這個(gè)過(guò)程中書寫著自己的篇章。讓我們攜手并進(jìn),共同努力,開(kāi)創(chuàng)美好的未來(lái)!愿我們?cè)诳萍嫉恼魍旧喜粩鄪^進(jìn),創(chuàng)造出更加美好、更加智能的明天!文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-751775.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-751775.html
到了這里,關(guān)于【SpringBoot篇】登錄校驗(yàn) — JWT令牌的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!