zoukankan      html  css  js  c++  java
  • 原创: shiro的token jwtUtils加解密工具包源码

    添加依赖pom.xml

     <!-- JAVA代码生成JWT-->
            <dependency>
                <groupId>io.jsonwebtoken</groupId>
                <artifactId>jjwt</artifactId>
                <version>0.9.0</version>
            </dependency>
    
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.1.37</version>
            </dependency>
    <!--        SONObject只是一种数据结构,可以理解为JSON格式的数据结构(key-value 结构),可以使用put方法给json对象添加元素。-->
            <dependency>
                <groupId>org.json</groupId>
                <artifactId>json</artifactId>
                <version>20140107</version>
            </dependency>
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.4</version>
            </dependency>

    jwtUtils.java

    package com.ibaiqi.house.utils;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    import com.sun.org.apache.xml.internal.security.algorithms.implementations.SignatureDSA;
    import io.jsonwebtoken.Claims;
    import io.jsonwebtoken.ExpiredJwtException;
    import io.jsonwebtoken.JwtBuilder;
    import io.jsonwebtoken.Jwts;
    import org.apache.shiro.codec.Base64;
    import io.jsonwebtoken.SignatureAlgorithm;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;
    import java.util.Date;
    
    public class JwtUtils {
     
        //密码
        private static final String secret = "66diangezanbageixioapang12oc";
    
           /**
         * (默认的超时时间)token存活时间,2小时
         */
        private static final long liveMills = 3600 * 2 * 1000;
    
    
        /**
         * 获取secret
         */
        public static SecretKey obtainKey() {
    
            //对key进行解码
            byte[] secretBytes = secret.getBytes();
            return new SecretKeySpec(secretBytes, 0, secretBytes.length, "AES");
        }
    
        /**
         * 获取token,使用默认的超时时间,即2个小时。
         *
         * @param sub 主题(需要加密的字符串)
         * @return token字符串
         */
        public static String createJWT(String sub) {
            return createJWT(sub, liveMills);
        }
    
        /**
         * 会自动对主题对象序列化(使用fastJson进行序列化)得到字符串
         *
         * @param subObj 主题对象
         * @return token字符串
         */
        public static <T> String createJWT(T subObj) {
            return createJWT(JSONObject.toJSONString(subObj), liveMills);
        }
    
        /**
         * 会自动对主题对象序列化(使用fastJson进行序列化)得到字符串
         *
         * @param subObj    主题对象
         * @param liveMills 失效时间,单位毫秒
         * @return token字符串
         */
        public static <T> String createJWT(T subObj, Long liveMills) {
            return createJWT(JSONObject.toJSONString(subObj), liveMills);
        }
    
        /**
         * @param sub       需要加密的主题
         * @param liveMills 失效时间,单位毫秒
         * @return 经过jwt加密的token字符串,失效时间即当前时间+liveMills毫秒数
         */
        public static String createJWT(String sub, Long liveMills) {
            //加密模式
            SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
    
            long currentTimeMillis = System.currentTimeMillis();
            Date now = new Date(currentTimeMillis);  //iat token签发时间
            SecretKey secretKey = obtainKey();
            //jti表示该token的唯一id,不推荐使用相同值|isa 下发时间
            JwtBuilder jwtBuilder = Jwts.builder().setId("jti-xp").
                    setIssuedAt(now). //设置签发时间
                    setSubject(sub).
                    signWith(signatureAlgorithm, secretKey);////设置签名秘钥
            if (liveMills > 0) {
                long expMills = currentTimeMillis + liveMills;
                Date expDate = new Date(expMills);  //失效时间
                jwtBuilder.setExpiration(expDate);
            }
            return jwtBuilder.compact();
        }
    
        /**
         * 解密token,返回Claims对象
         * <p>
         * 注,若token失效,会抛出{@link ExpiredJwtException}的异常
         **/
        public static Claims parseJWT(String token) {
            SecretKey key = obtainKey();
            return Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody();  // Claims [kleɪmz] 声明
        }
    
        /**
         * 解析token获取到sub(主题)。
         * <p>
         * 注,若token失效,会抛出{@link ExpiredJwtException}的异常
         */
        public static String parseJWT2Sub(String token) {
            SecretKey key = obtainKey();
            Claims body = Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody();
            return body.getSubject();
        }
    
        /**
         * 解密token获取sub,并反序列化为对象。
         *
         * @param token 需要解密的token字符串
         * @param clazz sub反序列化的对象类型
         */
        public static <T> T parseJWT2Sub(String token, Class<T> clazz) {
            SecretKey key = obtainKey();
            Claims body = Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody();
            return JSON.parseObject(body.getSubject(), clazz);
        }
    
    
        public static void main(String[] args) {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("username", "xiaopang");
            jsonObject.put("host", "127.0.0.1");
            System.out.println("jsonObject.toJSONString()的值:"+jsonObject.toJSONString());
            String token = JwtUtils.createJWT(jsonObject.toJSONString());
            System.out.println("生成的token:"+token);
            //解析token
            Claims claims = parseJWT(token);
            String subject = claims.getSubject();
            System.out.println(subject);
            //base64 payload解析
            String payload="eyJqdGkiOiJqdGkteHAiLCJpYXQiOjE1NjM5NDcxMTAsInN1YiI6IntcImhvc3RcIjpcIjEyNy4wLjAuMVwiLFwidXNlcm5hbWVcIjpcInhpYW9wYW5nXCJ9IiwiZXhwIjoxNTYzOTU0MzEwfQ";
            //org.apache.shiro.codec.Base64
            System.out.println("payload的base64解密:"+new String(Base64.decode(payload)));
            //base64 header解析
            String header="eyJhbGciOiJIUzI1NiJ9";
            System.out.println("header的base64解密:"+new String(Base64.decode(header)));
        }
    }
    做产品的程序,才是好的程序员!
  • 相关阅读:
    linux系统安装mysql数据库
    pyinstaller打包问题
    jmeter-Parameters和Body Data两种方式传参的区别
    jmeter-保存响应到文件
    Jenkins获取运行job的用户信息
    pytest插件(多重校验、用例依赖、执行顺序、失败重跑、重复执行、标记)
    谷歌开发者工具(F12)
    Linux常用命令
    一般什么原因会导致偶现问题?
    Fiddler模拟接口返回进行测试(二)
  • 原文地址:https://www.cnblogs.com/asplover/p/13277391.html
Copyright © 2011-2022 走看看