SpringBoot+JWT登录校验,以及JWT刷新机制

接上篇博客,继续讲解JWT的使用。

本部分内容主要是SpringBoot项目中具体使用JWT的代码实现,包括了登录创建Token,后续请求验证Token,并且加入了JWT刷新机制等等。

本文大纲:

1.JWT的引入

2.JWT工具类的实现

3.登录申请Token

4.请求验证Token

5.JWT刷新机制的实现

注意:本文注重使大家理解JWT如何在SpringBoot项目中集成和使用,包含了我项目中JWT使用的90%的代码,剩下10%的代码比如代码中导包的信息,Dao持久层的代码等不包含在本文章中,因此还需要自己根据自己项目的情况去集成本文的代码。

==========================================开始分割线===============================================

1、JWT的引入

项目中引入Jar包依赖

<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.4.0</version>
</dependency>

2、JWT工具类的实现

直接上工具类WebTokenUtil.java的源码,包含创建Token和校验,刷新机制等一系列操作:

public class WebTokenUtil {
    private static final Logger logger = LoggerFactory.getLogger(WebTokenUtil.class);
    //定义JWT的发布者,这里可以起项目的拥有者
    private static final String TOKEN_ISSUSER = "issue";
    //定义JWT的有效时长
    private static final int TOKEN_VAILDITY_TIME = 30; // 有效时间(分钟)
    //定义允许刷新JWT的有效时长(在这个时间范围内,用户的JWT过期了,不需要重新登录,后台会给一个新的JWT给前端,这个叫Token的刷新机制后面会着重介绍它的意义。)
    private static final int ALLOW_EXPIRES_TIME = 60*24; //  允许过期时间(分钟)
    /**
     * 根据用户的登录时间生成动态私钥
     * @param instant 用户的登录时间,也就是申请令牌的时间
     * @return
     */
    public static String genSecretKey(Instant instant){
        return String.valueOf(instant.getEpochSecond());
    }
    public static String create(String secretKey, String subject, Instant issueAt) {
        return create(secretKey, subject, issueAt, TOKEN_VAILDITY_TIME);
    }
    /**
     * 生成token
     * @param secretKey 根据用户的登录时间生成的秘钥
     * @param subject JWT中payload部分自定义的内容
     * @param issueAt 用户登录的时间,也就是申请令牌的时间
     * @param validityTime 有效时长(分钟)
     * @return
     */
    public static String create(String secretKey, String subject, Instant issueAt, int validityTime) {
        String token = "";
        Algorithm algorithm = null;
        try {
            algorithm = Algorithm.HMAC256(secretKey);
        } catch (IllegalArgumentException | UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        Instant exp = issueAt.plusSeconds(60*validityTime);
        token = JWT.create()
                .withIssuer(TOKEN_ISSUSER)
                .withClaim("sub", subject)
                .withClaim("iat", Date.from(issueAt))
                .withClaim("exp", Date.from(exp))
                .sign(algorithm);
        logger.trace("create token ["+token+"]; ");
        return token;
    }

    /**
     * 字符串token 解析为 jwtToken
     * @param token 要解析的Token
     * @return
     */
    public static DecodedJWT decode(String token){
        DecodedJWT jwtToken = null;
        try {
            jwtToken = JWT.decode(token);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return jwtToken;
    }

    /**
     * 验证token
     * @
  • 16
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 40
    评论
评论 40
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值