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());
}
}