JJWT-token(工具类)

前言

        客户端要通过操作访问服务器,第一次登录后服务器会生成一个token(用户id,失效时间...),然后把token返回给客户端留存。以后的每一次操作都可以携带token到服务端去进行验证。如果验证成功,那么继续执行,如果验证失败,不让访问或者去做其他操作(再次登录)。

一、token的格式

JJWT(Java json web token)生成的token字符串格式如下:

{header}.{body}.{加密信息}

header:指定当前token使用的加密算法

body:明文的签名信息,然后做了base64编码(签名信息如用户标识 签发时间 有效期)

密文:对body按照header中指定的加密算法的结果,以及服务端保存的秘钥。进行加密后的字符串

二、使用步骤

1.JWTUtil工具类

代码如下(示例):

package com.java.tokenTest;

import io.jsonwebtoken.*;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.io.Encoders;
import io.jsonwebtoken.security.Keys;
import javax.crypto.SecretKey;
import java.security.Key;
import java.util.Date;
import java.util.Map;

public class JWTUtil {
    //generateKey()生成的密钥
    private static String key="phRWtrZEV8lYkXqfcfr/5tD8Y9aHDX7yxDLswV5y4WU=";
    //设置有效期                 ( 5分钟)
    private static Long millData=5*60*1000L;

    /**
     * 生成密钥
     * @return 返回生成的密钥
     */
    public static String generateKey(){
        // 按照指定的算法 生成符合该算法长度的秘钥 32字节
        Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
        // 把生成的秘钥转换成字符串形式
        String encode = Encoders.BASE64.encode(key.getEncoded());
        return encode;
    }

    /**
     * 使用密钥进行加密生成 Token
     * @param map 明文
     * @return token字符串
     */
    public static String jwt(Map map){
        //设置当前时间
        Date currentDate = new Date();
        //设置失效时间
        Date expirationDate=new Date(currentDate.getTime()+millData);
        //把字符串密钥 转换成 Key 类型
        SecretKey secretKey = Keys.hmacShaKeyFor(Decoders.BASE64.decode(key));

        // 使用以下方法进行加密,返回值就是根据秘钥加密后的字符串
        String jwtStr = Jwts.builder().
                setClaims(map).// 设置自定义签名 eg:用户id
                setIssuedAt(currentDate).// 标准签名   生效时间
                setExpiration(expirationDate).// 失效时间
                signWith(secretKey).// 设置秘钥
                compact();
        return jwtStr;
    }

    /**
     * 检验token
     */
    public static Claims parse(String token){
        Jws<Claims> claimsJws=null;
        try {
            claimsJws= Jwts.parserBuilder().
                    setSigningKey(key).//指定秘钥
                    build().parseClaimsJws(token);//解析token字符串
        } catch (Exception e) {
            e.printStackTrace();
        }
        return claimsJws.getBody();
    }
}

2.测试代码如下(示例):

public class Test {
    public static void main(String[] args) {
//        Map<String, Object> map = new HashMap<>();
//        map.put("name","wkx");
//        map.put("sex","男");
//        String jwt = JWTUtil.jwt(map);
//        System.out.println("token密文:"+jwt);
//        token密文:eyJhbGciOiJIUzI1NiJ9.eyJzZXgiOiLnlLciLCJuYW1lIjoid2t4IiwiaWF0IjoxNjUzMzk0OTUxLCJleHAiOjE2NTMzOTUyNTF9.wyn0vBfFf8NcEPWr4sh6qhLZRo0RD17rMigpbZcOn0M

        Claims parse = JWTUtil.parse("eyJhbGciOiJIUzI1NiJ9.eyJzZXgiOiLnlLciLCJuYW1lIjoid2t4IiwiaWF0IjoxNjUzMzk0OTUxLCJleHAiOjE2NTMzOTUyNTF9.wyn0vBfFf8NcEPWr4sh6qhLZRo0RD17rMigpbZcOn0M");
        System.out.println(parse.get("name"));//wkx

    }
}

pom.xml中需要引入的依赖

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-api</artifactId>
    <version>0.11.1</version>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-impl</artifactId>
    <version>0.11.1</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-jackson</artifactId>
    <version>0.11.1</version>
    <scope>runtime</scope>
</dependency>

版权声明:本文为DW524245原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。