前述:

最近新项目,会话相关不是我搞的,但是比较好奇,就翻了翻,发现用到了JWT。
之前没听过更没用过。所以更好奇了。要扩充知识的广度。所以专门了解一下。

JWT是啥?

比较官方的表述是这样的:

JWT(JSON WEB TOKEN):JSON网络令牌,JWT是一个轻便的安全跨平台传输格式,定义了一个紧凑的自包含的方式在不同实体之间安全传输信息(JSON格式)。它是在Web环境下两个实体之间传输数据的一项标准。实际上传输的就是一个字符串。广义上讲JWT是一个标准的名称;狭义上JWT指的就是用来传递的那个token字符串

我的理解是:

JWT就是一个加密解密器,可以根据密钥将要加密的信息加密为一个AAAA.BBBB.CCCC格式的密文。我们可以拿这个密文作为token。也可以拿这个密文再调用JWT解密,获取被加密的信息。从而实现登陆生成token,再根据token获取会话信息的功能(token内存储了会话信息,所以即使服务器重启,也可以获取到会话信息)

JWT的结构

JWT主要有三部分,Header、Payload、Signature。

Head专业叫:标头。里面表明了令牌类型(我们肯定是JWT了),还有所使用的签名(sign)算法(如HS256)。会使用Base64将Head编码。

Payload专业叫:有效负载。其实就是以key、value的形式,存放了我们要存储的会话信息,如:userId,userName等。会使用Base64编码将Payload编码。

Signature就是:签名了。是将Head(编码后)+Payload(编码后)+密钥(自己定义的)。然后使用Head中定义的签名算法进行签名。这个就是保证JWT没被改变。就是加签、验签的概念。

JWT使用

Jar

<dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.4.0</version> </dependency>

生成

Java jwt token如何判断过期 jwt token校验_字符串

public static String createToken(Map<String, String> claims, String secret, Long expire) {
        try {
            if (claims == null || claims.size() == 0) {
                throw new RuntimeException("claims不能为空");
            }
            if (secret == null || secret.length() == 0) {
                throw new RuntimeException("jwtSecret不能为空");
            }
            if (expire == null) {
                throw new RuntimeException("expireTime不能为空");
            }
            Map<String, Object> header = new HashMap<>(3);
            header.put("alg", "HS256");
            header.put("typ", "JWT");
            Algorithm algorithm = Algorithm.HMAC256(secret);
            JWTCreator.Builder builder = JWT.create()
                    .withHeader(header)
                    .withIssuer(ISSUER)
                    .withExpiresAt(new Date(System.currentTimeMillis() + expire));
            claims.forEach(builder::withClaim);
            return builder.sign(algorithm);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

解析

Java jwt token如何判断过期 jwt token校验_JSON_02

public static final String ISSUER = "这是自定义的JWT解密用户";
    public static String jwtSecret = "这是一个自定义的密钥";

    public static void parseToken(String token) {
        Algorithm algorithm = Algorithm.HMAC256(jwtSecret);
        JWTVerifier verifier = JWT.require(algorithm)
                .withIssuer(ISSUER)
                .build();
        DecodedJWT decodedJWT = verifier.verify(token);
        //获取会话信息
        Long userId = decodedJWT.getClaim("userId").asLong();
        return;
    }

 总结

以上就是关于JWT的最最最基础的使用,我目前也是首次才了解(十分汗颜),所以稍微写篇文章记录下。

后面再针对JWT的具体实现看一下。