使用jwt记录

news/2024/7/5 5:38:16

pom依赖

        <!--        jwt依赖-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>

代码:

package com.example.demo;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.impl.Base64Codec;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@SpringBootTest
class JwtDemoApplicationTests {
    // 盐值
    public static final String KEY = "xiehui";


    // 生成jwt
    @Test
    public void contextLoads() {
        String token = Jwts.builder()
                // 设置id {"jti":"666"}
                .setId("666")
                // 签发用户 {"sub":"admin"}
                .setSubject("admin")
                // 签发时间 {"iat":"xxxx"}
                .setIssuedAt(new Date())
                .signWith(SignatureAlgorithm.HS256, KEY).compact();
        System.out.println(token);
        String[] split = token.split("\\.");
        // 头部信息
        System.out.println(Base64Codec.BASE64.decodeToString(split[0]));
        // 负载
        System.out.println(Base64Codec.BASE64.decodeToString(split[1]));
        // 签名
        System.out.println(Base64Codec.BASE64.decodeToString(split[2]));
    }

    // 解析jwt
    @Test
    public void parseJwt() {
        String jwt = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI2NjYiLCJzdWIiOiJhZG1pbiIsImlhdCI6MTYyMTY3MzY3NX0.XDx7j5wf8CQQLetnS624izT0S69HFOUaivGGDlzgXkc";
        Claims claims = Jwts.parser()
                .setSigningKey(KEY)
                .parseClaimsJws(jwt)
                .getBody();
        System.out.println("jti:" + claims.getId());
        System.out.println("sub:" + claims.getSubject());
        System.out.println("iat:" + claims.getIssuedAt());


    }


    // 创建jwt带过期时间
    @Test
    public void createJwtByExpireTime() {
        long now = System.currentTimeMillis();
        long expiretime = now + 60 * 1000; // 一分钟过期

        String token = Jwts.builder()
                // 设置id {"jti":"666"}
                .setId("666")
                // 签发用户 {"sub":"admin"}
                .setSubject("admin")
                // 签发时间 {"iat":"xxxx"}
                .setIssuedAt(new Date())
                .signWith(SignatureAlgorithm.HS256, KEY)
                // 设置过期时间
                .setExpiration(new Date(expiretime))
                .compact();

        System.out.println(token);
        String[] split = token.split("\\.");
        // 头部信息
        System.out.println(Base64Codec.BASE64.decodeToString(split[0]));
        // 负载
        System.out.println(Base64Codec.BASE64.decodeToString(split[1]));
        // 签名
        System.out.println(Base64Codec.BASE64.decodeToString(split[2]));
    }

    // 解析带过期时间的jwt
    @Test
    public void parseHasExpireTimeJwt() {
        String jwt = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI2NjYiLCJzdWIiOiJhZG1pbiIsImlhdCI6MTYyMTY3NDU4OCwiZXhwIjoxNjIxNjc0NjQ4fQ.qqGvg4vnsZOw7stF9HB_bDLF83y4U2NyVmkcxAMJ29c";
        Claims claims = Jwts.parser()
                .setSigningKey(KEY)
                .parseClaimsJws(jwt)
                .getBody();
        System.out.println("jti:" + claims.getId());
        System.out.println("sub:" + claims.getSubject());
        System.out.println("iat:" + claims.getIssuedAt());
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("签发时间:" + simpleDateFormat.format(claims.getIssuedAt()));
        System.out.println("当前时间:" + simpleDateFormat.format(new Date()));
        // 如果超过过期时间抛出ExpiredJwtException异常
        System.out.println("过期时间:" + simpleDateFormat.format(claims.getExpiration()));
    }


    //创建自定义声明内容的jwt
    @Test
    public void createHasCustomJwt() {
        // 自定义内容
        Map<String, Object> myClaims = new HashMap<>();
        myClaims.put("name", "谢辉");
        myClaims.put("age", 18);

        String token = Jwts.builder()
                // 设置id {"jti":"666"}
                .setId("666")
                // 签发用户 {"sub":"admin"}
                .setSubject("admin")
                // 签发时间 {"iat":"xxxx"}
                .setIssuedAt(new Date())
                .signWith(SignatureAlgorithm.HS256, KEY)
                // 通过map添加自定义内容
                .addClaims(myClaims)
                // 一条一条添加内容
                .claim("sex", "男")
                .compact();
        System.out.println(token);
        String[] split = token.split("\\.");
        // 头部信息
        System.out.println(Base64Codec.BASE64.decodeToString(split[0]));
        // 负载
        System.out.println(Base64Codec.BASE64.decodeToString(split[1]));
        // 签名
        System.out.println(Base64Codec.BASE64.decodeToString(split[2]));

    }

    // 解析自定义声明的jwt
    @Test
    public void parseHasCustomJwt() {
        String jwt = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI2NjYiLCJzdWIiOiJhZG1pbiIsImlhdCI6MTYyMTY3NTI2MSwibmFtZSI6Iuiwoui-iSIsImFnZSI6MTgsInNleCI6IueUtyJ9.eRmw16lZEZLXQUK86krLgUY4sbV5wbUJWdZ9OOiwNKY";
        Claims claims = Jwts.parser()
                .setSigningKey(KEY)
                .parseClaimsJws(jwt)
                .getBody();
        System.out.println("jti:" + claims.getId());
        System.out.println("sub:" + claims.getSubject());
        System.out.println("iat:" + claims.getIssuedAt());
        //获取自定义的内容
        System.out.println("name:" + claims.get("name"));
        System.out.println("age:" + claims.get("age"));
        System.out.println("sex:" + claims.get("sex"));
        // 过期时间
        // 过期时间:null,显示null表示永久有效
        System.out.println("过期时间:" + claims.getExpiration());

    }

}

地址:https://gitee.com/xieh-gitee/jwt-demo

 


http://www.niftyadmin.cn/n/4054451.html

相关文章

记录SpringBoot和SpringCloud版本对应关系

官方参考&#xff1a;https://spring.io/projects/spring-cloud SpringCloud版本SpringBoot版本Hoxton 2.2.x2.2.xGreenwich 2.1.x2.1.xFinchley 2.0.x2.0.xEdgware 1.5.x1.5.xDalston 1.5.x1.5.x

基于javax的websocket服务端实现心跳机制

websocket连接类 package com.dnn.controller.inter;import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet;import javax.websocket.…

js的clientXY、pageXY、screenXY、offsetXY属性对比

一、clientX、clientY 点击位置距离当前body可视区域的x&#xff0c;y坐标 二、pageX、pageY 对于整个页面来说&#xff0c;包括了被卷去的body部分的长度 三、screenX、screenY 点击位置距离当前电脑屏幕的x&#xff0c;y坐标 四、offsetX、offsetY 相对于带有定位的父盒子的x…

ElasticSearch使用kibana控制台查询示例(时间范围查询)

记录一下日期查询问题 "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"# 创建索引 PUT my_date1 {"mappings": {"properties": {"publicDate": {"type": "date","format": &quo…

SpringBoot整合Quartz 实现分布式定时任务调度

一、Quartz 集群架构 Quartz 是 Java 领域最著名的开源任务调度工具。 在上篇文章中&#xff0c;我们详细的介绍了 Quartz 的单体应用实践&#xff0c;如果只在单体环境中应用&#xff0c;Quartz 未必是最好的选择&#xff0c;例如Spring Scheduled一样也可以实现任务调度&am…

ElasticSearch6.X版本自动添加时间戳

需求&#xff1a;根据时间提取es数据 解决&#xff1a;为es的记录添加时间戳 1、方法 配置时间戳 pipeline PUT _ingest/pipeline/my_timestamp_pipeline {"description": "Adds a field to a document with the time of ingestion","processors&q…

ElasticsearchTemplate替换为ElasticsearchRestTemplate(Transport Client替换为RestHighLevelClient)

在Elasticsearch 8.0的版本中也将完全移除TransportClient&#xff0c;其次有些es有些账号不能通过 9300端口连接 所以项目中打算由RestHighLevelClient 替换掉 Transport Client 版本 这里给一张springboot官方的版本推荐 这里我的springboot版本为 2.1.6.RELEASE Elasticse…

ruby编码说明

程序编码一般分几种情况&#xff1a; 1、源码文件编码 2、接收外部内容的编码 3、运行环境编码 4、操作系统编码 首先源码文件的编码&#xff0c;可以通过在ruby文件的头部添加一行申明即可&#xff0c;这样所有在源码里面出现的字符都保存为指定的编码&#xff1a; # -*- codi…