1. 導入maven依賴
<!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.10.3</version>
</dependency>
2. 登錄成功后生成JWT
@ApiOperation("登錄")
@ResponseBody
@PostMapping("/login")
public HttpResult login(@RequestBody User user) throws Exception {
HttpResult result = new HttpResult();
try {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("username", user.getUsername());
queryWrapper.eq("password", user.getPassword());
User userDB = iUserService.getOne(queryWrapper);
if (userDB != null) {
//登錄成功后生成JWT
//JWT的header部分,該map可以是空的,因為有默認值{"alg":HS256,"typ":"JWT"}
Map<String, Object> map = new HashMap<>();
Calendar instance = Calendar.getInstance();
instance.add(Calendar.MINUTE,30);
String token = JWT.create()
.withHeader(map)//添加頭部
.withClaim("userid",userDB.getId())//添加payload
.withClaim("username",userDB.getUsername())
.withClaim("email",userDB.getEmail())
.withExpiresAt(instance.getTime())//設置過期時間
.sign(Algorithm.HMAC256("testjwt"));//設置簽名 密鑰
System.out.println(token);
result.setCode(200);
result.setMsg("登錄成功");
result.setData(token);
return result;
}
return HttpResult.error(204,"用戶名或密碼錯誤,請重新登錄!");
} catch (Exception err) {
throw new Exception("登錄錯誤:" + err.getMessage());
}
}
3. 請求其它路由時驗證JWT,並取出其中數據
@ApiOperation("驗證登錄")
@ResponseBody
@GetMapping("/verifyLogin/{token}")
public HttpResult verifyLogin(@PathVariable("token") String token) throws Exception {
HttpResult result = new HttpResult();
try {
//創建驗證對象,這里使用的加密算法和密鑰必須與生成TOKEN時的相同否則無法驗證
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("testjwt")).build();
//驗證JWT
DecodedJWT decodedJWT = jwtVerifier.verify(token);
//獲取JWT中的數據,注意數據類型一定要與添加進去的數據類型一致,否則取不到數據
System.out.println(decodedJWT.getClaim("userid").asInt());
System.out.println(decodedJWT.getClaim("username").asString());
System.out.println(decodedJWT.getClaim("email").asString());
System.out.println(decodedJWT.getExpiresAt());
result.setCode(200);
result.setMsg("驗證成功");
return result;
} catch (Exception err) {
throw new Exception("驗證錯誤:" + err.getMessage());
}
}