1、介紹
jwt就是將原始的json數據格式進行了安全的封裝,這樣就可以直接基于jwt在通信雙方安全的進行信息傳輸了。
2、jwt組成
第一部分:Header(頭), 記錄令牌類型、簽名算法等。 例如:{"alg":"HS256","type":"JWT"}
第二部分:Payload(有效載荷),攜帶一些自定義信息、默認信息等。 例如:{"id":"1","username":"Tom"}
第三部分:Signature(簽名),防止Token被篡改、確保安全性。將header、payload,并加入指定秘鑰,通過指定簽名算法計算而來。
3、目的
簽名的目的就是為了防jwt令牌被篡改,而正是因為jwt令牌最后一個部分數字簽名的存在,所以整個jwt 令牌是非常安全可靠的。一旦jwt令牌當中任何一個部分、任何一個字符被篡改了,整個令牌在校驗的時候都會失敗,所以它是非常安全可靠的。
4、引以賴
<!-- JWT依賴-->
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version>
</dependency>
5、工具類
public class JwtUtils {private static String signKey = "islunatic";//簽名密鑰private static Long expire = 43200000L; //有效時間/*** 生成JWT令牌* @param claims JWT第二部分負載 payload 中存儲的內容* @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第二部分負載 payload 中存儲的內容*/public static Claims parseJWT(String jwt){Claims claims = Jwts.parser().setSigningKey(signKey)//指定簽名密鑰.parseClaimsJws(jwt)//指定令牌Token.getBody();return claims;}
}
6、用例?(JWT令牌存儲在瀏覽器的本地存儲空間local storage中了 )
@RestController
@Slf4j
public class LoginController {//依賴業務層對象@Autowiredprivate EmpService empService;@PostMapping("/login")public Result login(@RequestBody Emp emp) {//調用業務層:登錄功能Emp loginEmp = empService.login(emp);//判斷:登錄用戶是否存在if(loginEmp !=null ){//自定義信息Map<String , Object> claims = new HashMap<>();claims.put("id", loginEmp.getId());claims.put("username",loginEmp.getUsername());claims.put("name",loginEmp.getName());//使用JWT工具類,生成身份令牌String token = JwtUtils.generateJwt(claims);return Result.success(token);}return Result.error("用戶名或密碼錯誤");}
}
7、注意
名稱 | 類型 | 是否必須 | 默認值 | 備注 | 其他信息 |
---|---|---|---|---|---|
code | number | 必須 | 響應碼, 1 成功 ; 0 失敗 | ||
msg | string | 非必須 | 提示信息 | ||
data | string | 必須 | 返回的數據 , jwt令牌 |