当前位置: 首页 > article >正文

JWTUtil工具类

 写一个Jwt工具类

导入如下pom.xml依赖


        <!--fastjson依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.33</version>
        </dependency>
        <!--jwt依赖-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.0</version>
        </dependency>

写一个JwtUtil工具类



import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
import java.util.Date;
import java.util.UUID;

/**
 * JWT工具类
 * @author zhangsan
 */
public class JwtUtil {

    /**
     * 有效期为 60 * 60 * 1000  一个小时
     */
    public static final Long JWT_TTL = 60 * 60 *1000L;
    /**
     * 设置秘钥明文
     */
    public static final String JWT_KEY = "sangeng";

    public static String getUUID(){
        return UUID.randomUUID().toString().replaceAll("-", "");
    }

    /**
     * 生成jtw
     * @param subject token中要存放的数据(json格式)
     * @return Jwt值
     */
    public static String createJWT(String subject) {
        // 设置过期时间
        JwtBuilder builder = getJwtBuilder(subject, null, getUUID());
        return builder.compact();
    }

    /**
     * 生成jtw
     * @param subject token中要存放的数据(json格式)
     * @param ttlMillis token超时时间
     * @return Jwt值
     */
    public static String createJWT(String subject, Long ttlMillis) {
        // 设置过期时间
        JwtBuilder builder = getJwtBuilder(subject, ttlMillis, getUUID());
        return builder.compact();
    }

    private static JwtBuilder getJwtBuilder(String subject, Long ttlMillis, String uuid) {
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        SecretKey secretKey = generalKey();
        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);
        if ( ttlMillis == null) {
            ttlMillis = JwtUtil.JWT_TTL;
        }
        long expMillis = nowMillis + ttlMillis;
        Date expDate = new Date(expMillis);
        return Jwts.builder()
                //唯一的ID
                .setId(uuid)
                // 主题  可以是JSON数据
                .setSubject(subject)
                // 签发者
                .setIssuer("sg")
                // 签发时间
                .setIssuedAt(now)
                // 使用HS256对称加密算法签名, 第二个参数为秘钥
                .signWith(signatureAlgorithm, secretKey)
                .setExpiration(expDate);
    }

    /**
     * 创建token
     * @param id Id
     * @param subject 主题
     * @param ttlMillis 时间戳
     * @return Jwt值
     */
    public static String createJWT(String id, String subject, Long ttlMillis) {
        // 设置过期时间
        JwtBuilder builder = getJwtBuilder(subject, ttlMillis, id);
        return builder.compact();
    }

    public static void main(String[] args) throws Exception {
        // 需要存放在token中的数据(可以是json格式的字符串)
        String subject = "{\"user\":\"tom\"}";

        // 生成一个有效期为1小时的JWT
        String token = JwtUtil.createJWT(subject, JwtUtil.JWT_TTL);
        System.out.println("token is " + token);

        // 解析对应的token
        Claims claim = parseJWT(token);
        System.out.println("claim is " + claim);
    }

    /**
     * 生成加密后的秘钥 secretKey
     * @return 生成加密后的密钥
     */
    public static SecretKey generalKey() {
        byte[] encodedKey = Base64.getDecoder().decode(JwtUtil.JWT_KEY);
        return new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
    }

    /**
     * 解析
     *
     * @param jwt string值
     * @return 返回解析的值
     */
    public static Claims parseJWT(String jwt) throws Exception {
        SecretKey secretKey = generalKey();
        return Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(jwt)
                .getBody();
    }


}

运行结果,我们可以看到,可以生成一个token,也可以解析出来对应token里携带的内容

放到对应的Jwt在线解析,可以看到解码成右边所示


http://www.kler.cn/a/396484.html

相关文章:

  • CDH安装与配置及相关大数据组件实践
  • js像循环数组那样循环一个数字,Array.from()
  • Python Web 应用开发基础知识
  • 如何修改npm包
  • 【Qt聊天室客户端】消息功能--发布程序
  • nginx proxy_pass中斜杠问题
  • 加深深度学习矩阵计算理解--用人类直觉 走进线性代数(非应试)
  • 自存 关于RestController请求传参数 前端和后端相关
  • web——upload-labs——第五关——大小写绕过绕过
  • HarmonyOS本地存储-Preferences(用户首选项)的使用
  • MATLAB 使用教程 —— 常用函数
  • Git 时想要放弃当前的 commit 操作
  • Javaweb-day11案例(文件)
  • 基于stm32的智能变频电冰箱系统
  • 网络安全练习之 ctfshow_web
  • 力扣 LeetCode 232. 用栈实现队列(Day5:栈与队列)
  • STM32F4 RTC实时时钟STM32 Cube实例
  • 掌握ECMAScript模块化:构建高效JavaScript应用
  • React Native 全栈开发实战班 - 状态管理入门(Context API)
  • Element plus使用menu时候如何在折叠时候隐藏掉组件自带的小箭头
  • vscode中执行git合并操作需要输入合并commit信息,打开的nano小型文本编辑器说明-
  • Queuing 表(buffer表)的优化实践 | OceanBase 性能优化实践
  • 1.两数之和-力扣(LeetCode)
  • DNS批量解析管理软件有什么用
  • Odoo :一款免费开源的日化行业ERP管理系统
  • windows下git和TortoiseGit(小乌龟)和putty安装配置对github进行操作