1.简介:
(1.1)JWT(Json Web Token):
为网络应用环境间传递声明而执行一种基于JSON开放标准
(1.2)JWT认证用户身份信息:
认证成功,才可获取其它资源,如:用户登录
(1.3)JWT最重要作用:
对 token信息防伪
(1.4)JWT的原理:
一个JWT由三个部分组成:公共部分、私有部分、签名部分。最后由这三者组合进行
base64编码得到JWT
如图:
(1.4.1)公共部分
主要是该JWT的相关配置参数,比如签名的加密算法、格式类型、过期时间等等
Key=ATGUIGU
(1.4.2)私有部分
用户自定义的内容,根据实际需要真正要封装的信息
userInfo{用户Id,用户昵称nickName}
(1.4.3)签名部分
SaltiP:当前服务器的IP地址!{linux 中配置代理服务器IP}
主要用户对JWT生成字符串的时候,进行加密{盐值}
最终组成:key+salt+userInfo è token!
base64编码:并不是加密,只是把明文信息变成了不可见的字符串
但是其实只要用一些工具就 ,可以把base64编码解成明文
所以不要在JWT中放入涉及私密信息
2.官网:
JSON Web Token Introduction - jwt.iohttps://jwt.io/introduction
3.SpringBoot集成JWT:
(2.1)pom.xml文件:
<!--引入JWT依赖--> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency>
(2.2)业务编写:
import java.util.Date; import java.util.UUID; import io.jsonwebtoken.*; import org.springframework.util.StringUtils; /** * 使用Jwt生成及获取token * 注:项目使用的是jdk1.9环境时,运行main测试jwt生成token会出现如下报错: * Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter * 解决方法: * (1)降到jdk1.8 * (2)添加jaxb-api依赖包 */ public class JwtUtil { //过期时间 private static long tokenExpiration = 24*60*60*1000; //签名秘钥 private static String tokenSignKey = "123456"; /** * 根据参数生成token * @param userId 登录用户ID * @param userName 登录名称 * @return */ public static String createToken(Long userId, String userName) { //使用jwt构建token信息 String token = Jwts.builder() .setId(UUID.randomUUID().toString()) //生成JWT_ID .setSubject("login_test") //设置标题 .setIssuer("Issuer") //设置签发人 .setAudience("Audience") //设置接收人 // 添加自定义值到生成token信息中 .claim("userId", userId) .claim("userName", userName) .setIssuedAt(new Date(System.currentTimeMillis())) //设置生成时间 .setExpiration(new Date(System.currentTimeMillis() + tokenExpiration)) //设置过期时间 .signWith(SignatureAlgorithm.HS512, tokenSignKey) //使用加密算法加密key .compressWith(CompressionCodecs.GZIP) //数据压缩方式 .compact(); return token; } /** * 根据token字符串得到用户id * @param token token字符串 * @return */ public static Long getUserId(String token) { if(StringUtils.isEmpty(token)) { return null; } //解析token字符串 Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token); //获取token信息体 Claims claims = claimsJws.getBody(); //获取用户id Integer userId = (Integer)claims.get("userId"); return userId.longValue(); } /** * 根据token字符串得到用户名称 * @param token token字符串 * @return */ public static String getUserName(String token) { if(StringUtils.isEmpty(token)){ return ""; } //解析token字符串 Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token); //获取token信息体 Claims claims = claimsJws.getBody(); return (String)claims.get("userName"); } /** * jwt生成token测试 * @param args */ public static void main(String[] args) { String token = JwtUtil.createToken(1L, "lucy"); System.out.println(token); //token字符串 System.out.println(JwtUtil.getUserId(token)); //登录用户id System.out.println(JwtUtil.getUserName(token)); //登录名称 } }
(2.3)业务测试:
在需要生成token调用JWT工具类生成即可