jwt是目前最常用的,也有些技术人员不用jwt存储,而是用redis做存储,因为jwt可以存储多个相同的key,这样导致安全的问题,还有无法删除jwt存储值。
当然如果不想用redis的话也可以将token存数据库里,登录的时候修改token也是可以的,不过就是有点太耗资源了。
生成token干嘛用呢?这个时候就需要配置springboot拦截器了,前端Ajax请求头header的时候可以通过springboot拦截判断有没有存储值,这里就不写了。
pom.xml配置
<!--jwt-->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.2.0</version> <!--设置最新版本,目前3.2.0-->
</dependency>
JWT工具类
public class JWTUtil {
//密钥
public static String TOKEN = "ken!Q%&(DSA*%#@";
/**
* 生成token
* @return
*/
public static String getToken(Map<String, String> map){
try {
//设置令牌过期时间 天为单位
Calendar instance = Calendar.getInstance();
//设置7天过期
instance.add(Calendar.DATE, 7);
//创建JWT builder
JWTCreator.Builder builder = JWT.create();
//payload(存储多个值)
map.forEach((k, v)->{
builder.withClaim(k, v);
});
String token = JWT.create()
.withExpiresAt(instance.getTime()) //令牌过期时间
.sign(Algorithm.HMAC256(TOKEN)); //签名密钥
return token;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
/**
* 获取token信息方法
* @param token
* @return
*/
public static DecodedJWT getTokenInfo(String token){
try {
DecodedJWT verify = JWT.require(Algorithm.HMAC256(TOKEN)).build().verify(token);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
}
登录使用
@RestController
public class AdminController {
@GetMapping("login")
public Map<String, Object> admin(String username, String password){
Map<String, Object> map = new HashMap<>();
try {
//写入数据库账号密码,这里我不写了
Map<String, String> payload = new HashMap<>();
payload.put("username", username); //可put多个参数
//生成token
String token = JWTUtil.getToken(payload);
//设置返回值
map.put("msg", "认证成功");
map.put("state", true);
map.put("token", token);
}catch (Exception e){
map.put("state", false);
map.put("msg", e.getMessage());
}
return map;
}
}
如果是需要做认证的话,就直接这样写就能获取到了
JWTUtil.getTokenInfo("token值").getClaim("username").asString();
文章评论