zoukankan      html  css  js  c++  java
  • 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;
        }
    
    }
  • 相关阅读:
    虚函数中的变量作用域问题
    C++技能重拾2
    C++技能重拾
    位运算取第一个非0的位 r & (~(r-1))
    ThoughtWorks微服务架构交流心得
    字符串匹配的sunday算法
    Codeforces Round #270(利用prim算法)
    HDFS建筑与shell操作
    Spark SQL 源代码分析系列
    HDU 4686 Arc of Dream(递归矩阵加速)
  • 原文地址:https://www.cnblogs.com/huzi007/p/11995898.html
Copyright © 2011-2022 走看看