jwt使用实战

  1. what is jwt?
    json web token,主要是用来做认证的,因为他是基于数字签名的 ,所以安全性贼高,是一种协议,本身是json格式,支持跨语言,同时它由三部分组成header(用于说明加密算法和说明是jwt),playload(传输用户需要携带的脱敏业务信息),signature(用来对前两部分进行签名认证的,防止篡改),由于jwt使用使用base64进行对称加密,所以不要传输任何敏感信息,因为这个相当于明文,但是客户端在不知道签名使用的加密盐情况下又是无法修改其信息,所以做到了,相对安全认证,而且不需要使用客户端cookie,所以可以防止csrf
  2. java中怎么开发
    在这里插入图片描述
    当我们知道了他的原理后,其实它的开发就很简单了,只要组装好它规定的字段就可以了,我们一般使用jjwt这个jar包,用户可以去maven仓库下载。
    操作主要使用JwtBuilder接口,使用Jwts.builder来生成一个DefaultJwtBuilder实例,而它又实现了JwtBuilder接口,所以有下面的方法。
    生成token
    当前台将这个token发送给后台时,我们需要使用下面的方法解析
    解析token
    下面提供一个java工具类其中 DateHandle.timeDifference就是一个时间差工具,自己计算下就行
public class TokenHandle {

    private static final String SALT = "xxxxx";

    /**
     * 登录生成token
     * @param claims
     * @return
     */
    public static String generateToken(Claims claims){
        return generateToken(claims, -1);
    }
    /**
     * 登录生成token
     * @param claims
     * @param exp 有效期
     * @return
     */
    public static String generateToken(Claims claims, Integer exp){
        JwtBuilder jwtBuilder = Jwts.builder();
        claims.setId(UUID.randomUUID().toString());
        claims.setIssuedAt(new Date());
        claims.setSubject("用户信息");
        jwtBuilder.setClaims(claims);
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        jwtBuilder.signWith(signatureAlgorithm,SALT);
        if(exp != null && exp > 0){
            jwtBuilder.setExpiration(new Date(System.currentTimeMillis()+exp));
        }
        return jwtBuilder.compact();
    }

    /**
     * 解析获取的token字符串
     * @param token
     * @return
     */
    public static Claims parseToken(String token){
        Claims claims;
        try {
            claims = Jwts.parser().setSigningKey(SALT)
                    .parseClaimsJws(token)
                    .getBody();
        } catch (ExpiredJwtException | UnsupportedJwtException | MalformedJwtException | SignatureException | IllegalArgumentException e) {
            return null;
        }
        return claims;
    }

    /**
     * 判断是否需要刷新token
     * @param claims
     * @return
     */
    public static Boolean needRefreshToken(Claims claims){
        Date expirationDate = claims.getExpiration();
        if(EmptyUtil.isEmpty(expirationDate)){
            return false;
        }
        Long validityPeriod = DateHandle.timeDifference(claims.getExpiration(), claims.getIssuedAt());
        Long differenceTime = DateHandle.timeDifference(new Date(), claims.getExpiration());
        return differenceTime > validityPeriod/2;
    }

    /**
     * 刷新token
     * @param claims
     * @return
     */
    public static String refreshToken(Claims claims){
        JwtBuilder jwtBuilder = Jwts.builder();
        Long validityPeriod = DateHandle.timeDifference(claims.getExpiration(), claims.getIssuedAt());
        claims.setIssuedAt(new Date());
        jwtBuilder.setClaims(claims);
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        jwtBuilder.signWith(signatureAlgorithm,SALT);
        jwtBuilder.setExpiration(new Date(System.currentTimeMillis()+validityPeriod));
        return jwtBuilder.compact();
    }
}
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值