JWT
JWT介绍
JWT(Json Web Token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。
JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源。比如用在用户登录上
JWT最重要的作用就是对 token信息的防伪作用。
JWT的原理, 一个JWT由三个部分组成:公共部分、私有部分、签名部分。最后由这三者组合进行base64编码得到JWT。
1、 公共部分
主要是该JWT的相关配置参数,比如签名的加密算法、格式类型、过期时间等等。
2、 私有部分
用户自定义的内容,根据实际需要真正要封装的信息。
3、 签名部分
SaltiP: 当前服务器的Ip地址!{linux 中配置代理服务器的ip}主要用户对JWT生成字符串的时候,进行加密{盐值}最终组成
key+salt+userInfo -> token!
base64编码,并不是加密,只是把明文信息变成了不可见的字符串。但是其实只要用一些工具就可以把base64编码解成明文,所以不要在JWT中放入涉及私密的信息。
集成JWT
引入依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
</dependency>
JWT工具类
import io.jsonwebtoken.*;
import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
public class JwtUtils {
// 过期时间 单位毫秒
private static long tokenExpiration = 24 * 60 * 60 * 1000;
// 密钥,使用随机生成,做加密操作
private static String tokenSignKey = "ukc8BDbRigUDaY6pZFfWus2jZWLPHO";
public static String createToken(Long userId, String userName) {
String token = Jwts.builder()
// 设置主体
.setSubject("jwt-test")
// 设置超时时间
.setExpiration(new Date(System.currentTimeMillis() + tokenExpiration))
// 设置token的主题部分,存储用户的信息
.claim("userId", userId)
.claim("userName", userName)
// 设置JWT的头信息
.signWith(SignatureAlgorithm.HS512, tokenSignKey)
.compressWith(CompressionCodecs.GZIP)
.compact();
return token;
}
// 得到token里的userId 封装在header里 可修改定制
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里的userId 可修改定制
public static Long getUserId(HttpServletRequest request) {
String token = request.getHeader("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里的userName 可修改定制
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");
}
// 得到token里的userName 封装在header里 可修改定制
public static String getUserName(HttpServletRequest request) {
String token = request.getHeader("token");
if (StringUtils.isEmpty(token)) return null;
Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
Claims claims = claimsJws.getBody();
String userName = (String) claims.get("userName");
return userName;
}
// 判断token是否存在与有效
public static boolean checkToken(String jwtToken) {
if (StringUtils.isEmpty(jwtToken)) return false;
try {
Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(jwtToken);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
// 判断token是否存在与有效 封装在header里
public static boolean checkToken(HttpServletRequest request) {
try {
String jwtToken = request.getHeader("token");
if (StringUtils.isEmpty(jwtToken)) return false;
Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(jwtToken);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
public static void main(String[] args) {
String token = JwtUtils.createToken(1L, "czs");
System.out.println(token);
if (checkToken(token)) {
System.out.println(JwtUtils.getUserId(token));
System.out.println(JwtUtils.getUserName(token));
} else {
System.out.println("token已过期");
}
}
}