JWT 刷新 token

项目使用的shiro+jwt来做整套权限加请求安全验证,但是jwt的token自己没有超时刷新机制,所以这里简单贴出解决方案。

解决方案:通过过期时间验证,如果 在你允许的期限内重新生成token. 废话不多刷直接上代码。方法并不完美,如果有更好的方案希望大神们能告知一下(可以改成捕捉jwt抛出的超时异常)。

创建token

 /**
     * 生成签名
     *
     * @param params  你的参数 ,可以是多个。根据你的业务需求
     * @return 加密的token
     */
    public static String sign(String params) {
        // EXPIRE_TIME : 你的有效时间。
        Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
        // SECRET : 你的 秘匙
        Algorithm algorithm = Algorithm.HMAC256(SECRET);
        // 附带params信息
        return JWT.create()
                .withClaim("params", params)
                .withExpiresAt(date)
                .sign(algorithm);
    }

验证token 刷新 token

 /**
     * 校验token是否正确
     * @Description  : TODO
     * @param        : token
     * @param        : params  你的参数 ,可以是多个。根据你的业务需求(必须和生成签名的参数一致)
     * @return       : java.lang.String
     * @author       : Mr.Xi
     * @date         : 19-4-24 上午10:41
     */
    public static String verify(String token, String params) {
        try {
            Algorithm algorithm = Algorithm.HMAC256(SECRET);
            JWTVerifier verifier = JWT.require(algorithm)
                    .withClaim("params", params)
                    .build();
            DecodedJWT jwt = verifier.verify(token);
            return token;
        } catch (Exception exception) {
            String errorStr  = exception.getMessage();
            String[] es = errorStr.split("The Token has expired on ");
            String dateStr = es[1].substring(0,es[1].length() - 1);
            Date toDate = null;
            try {
                toDate = parseDateString(dateStr);
                // 符合条件 重新生成token
                if (toDate != null && System.currentTimeMillis() - toDate.getTime() < EXPIRE_TIME) {
                    return sign(username,userId);
                } else {
                    return "error";
                }
            } catch (ParseException e) {
                e.printStackTrace();
                return "error";
            }
        }
    }
    
    /**
     * @Description  : TODO 日期转换
     * @param        : dateStr 日期字符串
     * @return       : java.util.Date
     * @author       : Mr.Xi
     * @date         : 19-4-25 下午4:18
     */
    private static Date parseDateString (String dateStr) throws ParseException {
        SimpleDateFormat sfStart = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy",java.util.Locale.ENGLISH) ;
        SimpleDateFormat sfEnd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String format = sfEnd.format(sfStart.parse(dateStr));
        return sfEnd.parse(format);
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值