一、JWT

JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。

一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。

1.头部(Header)

头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。这也可以被表示成一个JSON对象。这也可以被表示成一个JSON对象。{"typ":"JWT","alg":"HS256"}。在头部指明了签名算法是HS256算法。 我们进行BASE64编码base64 转图片 在线解码编码,编码后的字符串如下:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

2.载荷(playload)

载荷就是存放有效信息的地方。

定义一个payload:

{"sub":"1231567890","name":"John Doe","admin":true}

然后将其进行base64加密,得到Jwt的第二部分。

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG1gRG9lIiwiYWRtaW1iOnRydWV9

3.签证(signature)

jwt的第三部分是一个签证信息,这个签证信息由三部分组成:

header (base64后的)

payload (base64后的)

secret

这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。

TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

将这三部分用.连接成一个完整的字符串,构成了最终的jwt:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG1gRG9lIiwiYWRtaW1iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

二、JJWT签发与验证token

1.创建token

创建一个maven项目,在pom.xml文件中导入依赖

    <dependencies>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.0</version>
        </dependency>
    </dependencies>

创建测试类,代码如下

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

import java.util.Date;

/**
 * 创建token
 */
public class JwtTest1 {
    public static void main(String[] args) {
        JwtBuilder builder = Jwts.builder().setId("888") //设置唯一编号
                .setSubject("小白") //设置主题  可以是JSON数据
                .setIssuedAt(new Date()) //设置签发日期
                .signWith(SignatureAlgorithm.HS256, "itcast");
        //设置签名 使用HS256算法,并设置SecretKey(字符串) //构建 并返回一个字符串
        System.out.println(builder.compact());
    }
}

2.解析token

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;

/**
 * 解析token
 */
public class JwtTest2 {
    public static void main(String[] args) {
        String compactJwt = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiOjE3MjI0MDc1NDd9.veykODIHFPGuLo0hxov51MoVPRqoQWRws5zjA5aPyHE";
        Claims claims = Jwts.parser().setSigningKey("itcast").parseClaimsJws(compactJwt).getBody();
        System.out.println(claims);
    }
}

3.设置过期时间

创建token 并设置过期时间
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

/**
 * 创建token 并设置过期时间
 */
public class JwtTest3 {
    public static void main(String[] args) {
        //当前时间
        Date date = new Date();
        Date dateOut = new Date(date.getTime() + 1000 * 30);
        JwtBuilder builder = Jwts.builder().setId("888") //设置唯一编号
                .setSubject("小白")//设置主题  可以是JSON数据
                .setIssuedAt(date)//设置签发日期
                .setExpiration(dateOut)//用于设置过期时间 ,参数为Date类型数据
                .signWith(SignatureAlgorithm.HS256, "itcast");//设置签名 使用HS256算法,并设置SecretKey(字符串) //构建 并返回一个字符串
        System.out.println(builder.compact());
    }
}
解析TOKEN
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;

/**
 * 解析TOKEN
 */
public class JwtTest4 {
    public static void main(String[] args) {
        String compactJwt = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiOjE3MjI0MTExNTIsImV4cCI6MTcyMjQxMTE4Mn0.WdnGg_5TSLHAjV0VYAuZE4Nr9JqP6ZpTOTPz6oyXIpk";
        Claims claims = Jwts.parser().setSigningKey("itcast").parseClaimsJws(compactJwt).getBody();
        System.out.println(claims);
    }
}

4.自定义claims

创建token
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

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

/**
 * 创建token
 */
public class JwtTest5 {
    public static void main(String[] args) {
        //当前时间
        Date date = new Date();
        Date dateOut = new Date(date.getTime() + 1000 * 15);
        Map m = new HashMap();
        m.put("name", "itcast");
        m.put("age", 18);
        m.put("sex", "man");
        JwtBuilder builder = Jwts.builder().setId("888") //设置唯一编号
                .setSubject("小白")//设置主题  可以是JSON数据
                .setIssuedAt(date)//设置签发日期
                .setExpiration(dateOut)//用于设置过期时间 ,参数为Date类型数据
                .setClaims(m)
                .signWith(SignatureAlgorithm.HS256, "itcast");//设置签名 使用HS256算法,并设置SecretKey(字符串) //构建 并返回一个字符串
        System.out.println(builder.compact());
    }
}
解析TOKEN
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;

/**
 * 解析TOKEN
 */
public class JwtTest6 {
    public static void main(String[] args) {
        String compactJwt = "eyJhbGciOiJIUzI1NiJ9.eyJzZXgiOiJtYW4iLCJuYW1lIjoiaXRjYXN0IiwiYWdlIjoxOH0.XH2y6-5qAJQ6Rzmyx9PKYwzY5FHXi_dhWRLsyCNLqHE";
        Claims claims = Jwts.parser().setSigningKey("itcast").parseClaimsJws(compactJwt).getBody();
        System.out.println(claims);
    }
}

三、创建JWTUtils工具类

package com.buka;

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

import java.util.Date;
import java.util.Map;
import java.util.UUID;

public class JwtUtils {
    public static String encrypt(Map map, Date dateOut) {
        //当前时间
        Date date = new Date();
        JwtBuilder builder = Jwts.builder().setId(UUID.randomUUID().toString()) //设置唯一编号
                .setSubject("JWT")//设置主题  可以是JSON数据
                .setIssuedAt(date)//设置签发日期
                .setExpiration(dateOut)//用于设置过期时间 ,参数为Date类型数据
                .setClaims(map)
                .signWith(SignatureAlgorithm.HS256, "itbuka");//设置签名 使用HS256算法,并设置SecretKey(字符串) //构建 并返回一个字符串
        return builder.compact();
    }

    public static Map decrypt( String compactJwt) {
        Claims claims = Jwts.parser().setSigningKey("itbuka").parseClaimsJws(compactJwt).getBody();
        return claims;
    }
}

若觉得有帮助,欢迎点赞关注,一起成长进步~
声明​​:本文仅供学习交流,禁作商用;禁篡改、歪曲及有偿传播,引用需标明来源。侵权必究。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐