甘肅最新消息今天seo優(yōu)化顧問(wèn)
目錄
一、JWT介紹
二、安裝依賴
?三、登陸接口
1、令牌工具類(lèi)
2、接口代碼
四、說(shuō)明
一、JWT介紹
JWT全稱(chēng):JSON Web Token (官網(wǎng):JSON Web Tokens - jwt.io)
-
定義了一種簡(jiǎn)潔的、自包含的格式,用于在通信雙方以json數(shù)據(jù)格式安全的傳輸信息。由于數(shù)字簽名的存在,這些信息是可靠的。
簡(jiǎn)潔:是指jwt就是一個(gè)簡(jiǎn)單的字符串??梢栽谡?qǐng)求參數(shù)或者是請(qǐng)求頭當(dāng)中直接傳遞。
自包含:指的是jwt令牌,看似是一個(gè)隨機(jī)的字符串,但是我們是可以根據(jù)自身的需求在jwt令牌中存儲(chǔ)自定義的數(shù)據(jù)內(nèi)容。如:可以直接在jwt令牌中存儲(chǔ)用戶的相關(guān)信息。
簡(jiǎn)單來(lái)講,jwt就是將原始的json數(shù)據(jù)格式進(jìn)行了安全的封裝,這樣就可以直接基于jwt在通信雙方安全的進(jìn)行信息傳輸了。
JWT的組成: (JWT令牌由三個(gè)部分組成,三個(gè)部分之間使用英文的點(diǎn)來(lái)分割)
-
第一部分:Header(頭), 記錄令牌類(lèi)型、簽名算法等。 例如:{"alg":"HS256","type":"JWT"}
-
第二部分:Payload(有效載荷),攜帶一些自定義信息、默認(rèn)信息等。 例如:{"id":"1","username":"Tom"}
-
第三部分:Signature(簽名),防止Token被篡改、確保安全性。將header、payload,并加入指定秘鑰,通過(guò)指定簽名算法計(jì)算而來(lái)。
簽名的目的就是為了防jwt令牌被篡改,而正是因?yàn)閖wt令牌最后一個(gè)部分?jǐn)?shù)字簽名的存在,所以整個(gè)jwt 令牌是非常安全可靠的。一旦jwt令牌當(dāng)中任何一個(gè)部分、任何一個(gè)字符被篡改了,整個(gè)令牌在校驗(yàn)的時(shí)候都會(huì)失敗,所以它是非常安全可靠的。
?
JWT是如何將原始的JSON格式數(shù)據(jù),轉(zhuǎn)變?yōu)樽址哪?#xff1f;
其實(shí)在生成JWT令牌時(shí),會(huì)對(duì)JSON格式的數(shù)據(jù)進(jìn)行一次編碼:進(jìn)行base64編碼
Base64:是一種基于64個(gè)可打印的字符來(lái)表示二進(jìn)制數(shù)據(jù)的編碼方式。既然能編碼,那也就意味著也能解碼。所使用的64個(gè)字符分別是A到Z、a到z、 0- 9,一個(gè)加號(hào),一個(gè)斜杠,加起來(lái)就是64個(gè)字符。任何數(shù)據(jù)經(jīng)過(guò)base64編碼之后,最終就會(huì)通過(guò)這64個(gè)字符來(lái)表示。當(dāng)然還有一個(gè)符號(hào),那就是等號(hào)。等號(hào)它是一個(gè)補(bǔ)位的符號(hào)
需要注意的是Base64是編碼方式,而不是加密方式。
二、安裝依賴
<!-- JWT依賴-->
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version>
</dependency>
?三、登陸接口
1、令牌工具類(lèi)
public class JwtUtils {private static String signKey = "zqhjwt";//簽名密鑰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))//過(guò)期時(shí)間.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)//指定令牌Token.getBody();return claims;}
}
2、接口代碼
LoginController
@RestController
public class LoginController {@AutowiredEmpService empService;@PostMapping("login")public Result login(@RequestBody Emp emp){Emp e = empService.login(emp);if(e!= null){Map<String,Object> clzims = new HashMap<>();clzims.put("id",e.getId());clzims.put("name",e.getName());clzims.put("username",e.getUsername());// 生成jwt令牌String jwt = JwtUtils.generateJwt(clzims);return Result.success(jwt);}return Result.error("用戶名或密碼錯(cuò)誤");}}
Service
@Overridepublic Emp login(Emp emp) {Emp loginEmp = empMapper.getByUerAndPsw(emp);return loginEmp;}
mapper
@Select("SELECT * from emp where username = #{username} and password = #{password}")Emp getByUerAndPsw(Emp emp);
四、說(shuō)明
需求:
-
生成令牌
在登錄成功之后來(lái)生成一個(gè)JWT令牌,并且把這個(gè)令牌直接返回給前端 -
校驗(yàn)令牌
攔截前端請(qǐng)求,從請(qǐng)求中獲取到令牌,對(duì)令牌進(jìn)行解析校驗(yàn)
步驟:
-
引入JWT工具類(lèi)
在項(xiàng)目工程下創(chuàng)建uitle包,并把提供JWT工具類(lèi)復(fù)制到該包下 -
登錄完成后,調(diào)用工具類(lèi)生成JWT令牌并返回
接口文檔
-
響應(yīng)數(shù)據(jù)
參數(shù)格式:application/json
參數(shù)說(shuō)明:
名稱(chēng) 類(lèi)型 是否必須 默認(rèn)值 備注 其他信息 code number 必須 響應(yīng)碼, 1 成功 ; 0 失敗 msg string 非必須 提示信息 data string 必須 返回的數(shù)據(jù) , jwt令牌 響應(yīng)數(shù)據(jù)樣例:
{"code": 1,"msg": "success","data": "eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoi6YeR5bq4IiwiaWQiOjEsInVzZXJuYW1lIjoiamlueW9uZyIsImV4cCI6MTY2MjIwNzA0OH0.KkUc_CXJZJ8Dd063eImx4H9Ojfrr6XMJ-yVzaWCVZCo" }
-
備注說(shuō)明
用戶登錄成功后,系統(tǒng)會(huì)自動(dòng)下發(fā)JWT令牌,然后在后續(xù)的每次請(qǐng)求中,都需要在請(qǐng)求頭header中攜帶到服務(wù)端,請(qǐng)求頭的名稱(chēng)為 token ,值為 登錄時(shí)下發(fā)的JWT令牌。
如果檢測(cè)到用戶未登錄,則會(huì)返回如下固定錯(cuò)誤信息:
{"code": 0,"msg": "NOT_LOGIN","data": null }
解讀完接口文檔中的描述了,目前我們先來(lái)完成令牌的生成和令牌的下發(fā),我們只需要生成一個(gè)令牌返回給前端就可以了。