前言
这里是案例源码 springboot_jwt,喜欢的同学可以给一个star呢!哈哈哈!
首先你得引入Maven依赖(第一步)
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>
然后你需要创建一个JWT的工具类(第二步)
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.interfaces.DecodedJWT;
import java.io.UnsupportedEncodingException;
import java.util.Date;
/**
* @Auther: xipiker
* @Date: 2019-8-6
* @Description: JWT
*/
public class JwtUtils {
// 过期时间一个星期
private static final long EXPIRE_TIME = 7 * 24 * 60 * 60 * 1000;
// 签名秘钥
private static final String SECRET = "xipiker";
/**
* 校验token是否正确
*
* @param token 密钥
* @param userCode 用户名
* @return 是否正确
*/
public static boolean verify(String token, String userCode) {
try {
Algorithm algorithm = Algorithm.HMAC256(SECRET);
JWTVerifier verifier = JWT.require(algorithm)
.withClaim("userCode", userCode)
.build();
verifier.verify(token);
return true;
} catch (Exception exception) {
return false;
}
}
/**
* 获得token中的信息无需secret解密也能获得
*
* @return token中包含的用户名
*/
public static String getUserCode(String token) {
try {
DecodedJWT jwt = JWT.decode(token);
return jwt.getClaim("userCode").asString();
} catch (JWTDecodeException e) {
return null;
}
}
/**
* 生成签名,指定时间后过期,一经生成不可修改,令牌在指定时间内一直有效
* @param userCode 用户名
* @return 加密的token
*/
public static String createJWT(String userCode) {
try {
Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
Algorithm algorithm = Algorithm.HMAC256(SECRET);
// 附带username信息
return JWT.create()
.withClaim("userCode", userCode)
.withExpiresAt(date)
.sign(algorithm);
} catch (UnsupportedEncodingException e) {
return null;
}
}
}
最后你需要编写Controller层来测试你得工具类是否有问题(第三步)
/**
* @author: xipiker
* @Date: 2019-8-6
* @Description: JwtController
*/
@Controller
public class JwtController {
/**
* 生成用户对应的token
* @param username
* @return token
*/
@ResponseBody
@RequestMapping(value="login", method = RequestMethod.POST)
public String login(String username) {
String JWT = JwtUtils.createJWT(username);
return JWT;
}
/**
* 验证token是否有效
* @param token
* @param username
* @return String
*/
@ResponseBody
@RequestMapping(value="verifyToken", method = RequestMethod.POST)
public String verifyToken(String token, String username) {
Boolean flag = JwtUtils.verify(token, username);
if(flag){
return "token success";
}else {
return "token error";
}
}
/**
* 无需SECRET,直接获取用户信息
* @param token
* @return userCode
*/
@ResponseBody
@RequestMapping(value="findUserCode", method = RequestMethod.POST)
public String findUserCode(String token) {
return JwtUtils.getUserCode(token);
}
}
最后测试环节,测试工具使用PostMan,不废话,看测试图。
这里输入username:xipiker,返回对应token
接下来验证token是否正确
输入刚才产生的token,和对应的username,会返回"token success"否则返回"token error"。
最后一步“无需SECRET,直接获取用户信息”验证,主要是写业务逻辑用的,一般不需要暴露接口,这里为了方便测试暴露了一下。
后续会学习整理SpringBoot+Shiro+Jwt(RBAC),希望能通过努力可以做得完善。
谢谢大家的支持,可以给点鼓励给个赞呢!哈哈哈!