token

1.token验证流程:
    机制:验证;
    客户端与服务器分离,客户端页面加载,首先须验证token。其时间周期内可不用重复验证token。(输入密码:获取token)
验证失败:1.token==null;2.时间周期过了→跳转到登录面。

 

2.使用token,首先得将token所需jar包依赖进来

复制代码
<!--JWT_token认证-->
    <dependency>
      <groupId>com.auth0</groupId>
      <artifactId>java-jwt</artifactId>
      <version>3.2.0</version>
    </dependency>
    <dependency>
      <groupId>io.jsonwebtoken</groupId>
      <artifactId>jjwt</artifactId>
      <version>0.7.0</version>
    </dependency>

    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.8.7</version>
    </dependency>
复制代码

 

 

3.定义操作类

复制代码
public class TokenUtil {

    /**-------------------------------------------------------------------------------------------------------
     * TODO: createJWT-创建token
     * @param id 用户编号
     * @param issuer 用户名/编码
     * @param subject 用户角色、姓名或其它信息
     * @param ttlMillis token时限
     * @return java.lang.String 返回token
   -------------------------------------------------------------------------------------------------------*/
    public static String createJWT(String id, String issuer, String subject, long ttlMillis) {//创建一个token

        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;//加密算法

        long nowMillis = System.currentTimeMillis();//当前系统的时间
        Date now = new Date(nowMillis);

        byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(com.lixuan.diploma.utils.jwt.SystemSignCfg.JWT_SECERT);//生成64位加密算法
        Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());

        JwtBuilder builder = Jwts.builder().setId(id)//生成JwtBuilder
                .setIssuedAt(now)
                .setSubject(subject)
                .setIssuer(issuer)
                .signWith(signatureAlgorithm, signingKey);

        if (ttlMillis >= 0) {//续时间
            long expMillis = nowMillis + com.lixuan.diploma.utils.jwt.SystemSignCfg.TTLMILLIS;
            Date exp = new Date(expMillis);
            builder.setExpiration(exp);
        }
        return builder.compact();
    }

    /**------------------------------------------------------------------------------------------------------
     * TODO:parseJWT-解析token
     * @param jwt token
     * @return io.jsonwebtoken.Claims 载荷
-------------------------------------------------------------------------------------------------------*/
    public static Claims parseJWT(String jwt) {
        Claims claims = Jwts.parser()
                .setSigningKey(DatatypeConverter.parseBase64Binary(com.lixuan.diploma.utils.jwt.SystemSignCfg.JWT_SECERT))
                .parseClaimsJws(jwt).getBody();
        return claims;
    }

    /**------------------------------------------------------------------------------------------------------
     * TODO:validateJWT-验证token
     * @param jwt token
     * @return com.gudh.academic.util.jwt.CheckResult
-------------------------------------------------------------------------------------------------------*/
    public static CheckResult validateJWT(String jwt) {
        CheckResult checkResult = new CheckResult();
        Claims claims = null;
        try {
            claims = parseJWT(jwt);
            checkResult.setSuccess(true);
            checkResult.setClaims(claims);
        } catch (ExpiredJwtException e) {//超时异常:-1
            checkResult.setErrCode(com.lixuan.diploma.utils.jwt.SystemSignCfg.JWT_ERRCODE_EXPIRE);
            checkResult.setSuccess(false);
        } catch (SignatureException e) {//签名异常-2
            checkResult.setErrCode(com.lixuan.diploma.utils.jwt.SystemSignCfg.JWT_ERRCODE_FAIL);
            checkResult.setSuccess(false);
        } catch (Exception e) {//-2
            checkResult.setErrCode(com.lixuan.diploma.utils.jwt.SystemSignCfg.JWT_ERRCODE_FAIL);
            checkResult.setSuccess(false);
        }
        return checkResult;
    }

}
复制代码
复制代码
public class CheckResult {
    private boolean success;//是否成功
    private int errCode;//验证失败后失败码是多少
    private Claims claims;//载荷

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public int getErrCode() {
        return errCode;
    }

    public void setErrCode(int errCode) {
        this.errCode = errCode;
    }

    public Claims getClaims() {
        return claims;
    }

    public void setClaims(Claims claims) {
        this.claims = claims;
    }
}
复制代码
public class SystemSignCfg{
    public static final String JWT_SECERT="lixuan@123";//配置Tocken密钥(公共密码)
    public static final int JWT_ERRCODE_EXPIRE=-1; //时限过期标识
    public static final int JWT_ERRCODE_FAIL=-2; //失败标识
    public static final long TTLMILLIS=1000*60*300; //配置tocken超时时限制  1000毫秒:1s*60*300=300min
}

 

posted @   醭酹  阅读(124)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示