jwt工具类的封装

第一步先引入jar:

<dependency>
     <groupId>com.nimbusds</groupId>
     <artifactId>nimbus-jose-jwt</artifactId>
     <version>8.2.1</version>
</dependency>

第二步:工具类封装:

public final class Jwt {

    /**
     * 秘钥
     */
    private static final byte[] SECRET = "3d990d2276917dfac04467df11fff26d".getBytes();

    /**
     * 初始化head部分的数据为
     * {
     * "alg":"HS256",
     * "type":"JWT"
     * }
     */
    private static final JWSHeader HEADER = new JWSHeader(JWSAlgorithm.HS256, JOSEObjectType.JWT, null, null, null, null, null, null, null, null, null, null, null);

    /**
     * 生成token,该方法只在用户登录成功后调用
     *
     * @param payload 集合,可以存储用户id,token生成时间,token过期时间等自定义字段
     * @return token字符串, 若失败则返回null
     */
    public static String createToken(Map<String, Object> payload) {
        String tokenString = null;
        // 创建一个 JWS object
        JWSObject jwsObject = new JWSObject(HEADER, new Payload(new JSONObject(payload)));
        try {
            // 将jwsObject 进行HMAC签名
            jwsObject.sign(new MACSigner(SECRET));
            tokenString = jwsObject.serialize();
        } catch (JOSEException e) {
            System.err.println("签名失败:" + e.getMessage());
            e.printStackTrace();
        }
        return tokenString;
    }


    /**
     * 校验token是否合法,返回Map集合,集合中主要包含    state状态码   data鉴权成功后从token中提取的数据
     * 该方法在过滤器中调用,每次请求API时都校验
     *
     * @param token
     * @return Map<String, Object>
     */
    public static Map<String, Object> validTokens(String token) {
        Map<String, Object> resultMap = new HashMap<String, Object>(2);
        try {
            JWSObject jwsObject = JWSObject.parse(token);
            Payload payload = jwsObject.getPayload();
            JWSVerifier verifier = new MACVerifier(SECRET);
            if (jwsObject.verify(verifier)) {
                JSONObject jsonObj = payload.toJSONObject();
                // token校验成功(此时没有校验是否过期)
                resultMap.put("state", TokenState.VALID.toString());
                // 若payload包含ext字段,则校验是否过期
                String exp = "exp";
                if (jsonObj.containsKey(exp)) {
                    long expTime = Long.valueOf(jsonObj.get("exp").toString());
                    long curTime = System.currentTimeMillis();
                    // 过期了
                    if (curTime > expTime) {
                        resultMap.clear();
                        resultMap.put("state", TokenState.EXPIRED.toString());
                    }
                }
                resultMap.put("data", jsonObj);

            } else {
                // 校验失败
                resultMap.put("state", TokenState.INVALID.toString());
            }

        } catch (Exception e) {
            e.printStackTrace();
            // token格式不合法导致的异常
            resultMap.clear();
            resultMap.put("state", TokenState.INVALID.toString());
        }
        return resultMap;
    }


    /**
     * 生成token的方法
     * @param uid 需要保存的数据对象字符串
     * @param expTime 有效时间 默认为2小时
     * @return
     */
    public static String getToken(String uid,Long expTime){
        //获取生成token
        Map<String, Object> map = new HashMap<>(3);
        //建立载荷,这些数据根据业务,自己定义。
        map.put("uid", uid);
        long time= System.currentTimeMillis();
        long exptime;
        if(expTime == null || expTime < 0L ){
            exptime= DateUtil.addHour(new Date(time),2).getTime() ;
        }else{
            exptime=time+expTime;
        }
        //生成时间
        map.put("sta", System.currentTimeMillis());
        //过期时间
        map.put("exp", exptime);
        try {
            String token = Jwt.createToken(map);
            return token;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 生成token方法, 有效时间 默认为2小时
     * @param uid
     * @return
     */
    public static String getToken(String uid){
        return getToken(uid,null);
    }

    /**
     * 验证token方法
     * @param token
     * @return
     */
    public static Boolean validToken(String token){
        //解析token
        if (ObjectHelper.isNotEmpty(token)) {
            Map<String, Object> validMap = validTokens(token);
            String state=(String)validMap.get("state");
            if(TokenState.VALID.toString().equals(state)){
                return Boolean.TRUE;
            }
        }
        return Boolean.FALSE;
    }

}

 

posted @ 2019-12-06 16:11  全力以赴001  阅读(1056)  评论(0编辑  收藏  举报