JWT生成token

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工具类生成即可

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值