一、JWT介绍
JWT(Json Web Token)是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准。JWT 最重要的作用就是对 token 信息的防伪作用。
JWT 原理:由三个部分组成:公共部分、私有部分、签名部分,最后由这三者组合进行base64编码得到 JWT。
说明 | |
---|---|
公共部分 | 主要是该 JWT 的相关配置参数,比如签名的加密算法、格式类型、过期时间等等。 |
私有部分 | 用户自定义的内容,根据实际需要真正要封装的信息。 |
签名部分 | 主要用户对 JWT 生成字符串的时候,进行加密 {盐值} |
base64编码 | 并不是加密,只是把明文信息变成了不可见的字符串。 但是其实只要用一些工具就可以把base64编码解成明文,所以不要在 JWT 中放入涉及私密的信息。 |
二、整合 JWT
第一步,引入依赖。
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
</dependency>
第二步,编写 JwtHelper 工具类。
public class JwtHelper {
private static long tokenExpiration = 2*60*60*1000; //2小时
private static String tokenSignKey = "parker7"; //加密密钥
/**
* 根据参数生成token
* @param userId
* @param userName
* @return
*/
public static String createToken(Long userId, String userName) {
String token = Jwts.builder()
.setSubject("IMEDI-USER")
//设置过期时间
.setExpiration(new Date(System.currentTimeMillis() + tokenExpiration))
//设置token主体
.claim("userId", userId)
.claim("userName", userName)
//设置加密为哈希
.signWith(SignatureAlgorithm.HS512, tokenSignKey)
.compressWith(CompressionCodecs.GZIP)
.compact();
return token;
}
/**
* 根据token字符串反向得到用户id
* @param token
* @return
*/
public static Long getUserId(String token) {
if(StringUtils.isEmpty(token)) return null;
Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
Claims claims = claimsJws.getBody();
Integer userId = (Integer)claims.get("userId");
return userId.longValue();
}
/**
* 根据token字符串反向得到用户名
* @param token
* @return
*/
public static String getUserName(String token) {
if(StringUtils.isEmpty(token)) return "";
Jws<Claims> claimsJws
= Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
Claims claims = claimsJws.getBody();
return (String)claims.get("userName");
}
//测试用主类
public static void main(String[] args) {
String token = JwtHelper.createToken(7L, "parker");
System.out.println(token);
System.out.println(JwtHelper.getUserId(token));
System.out.println(JwtHelper.getUserName(token));
}
}
第三步,在相关 Service 接口中调用 JwtHelper 来生成 token。
public Map<String, Object> login(LoginVo loginVo) {
......
//jwt生成token字符串
String token = JwtHelper.createToken(loginVo.getId(), name);
map.put("token",token);
return map;
}