JWT令牌 案例:mysc-parent3

1. 在公共模块添加依赖

Jwt令牌_System

        <!-- Jwt令牌依赖 -->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.0</version>
        </dependency>

2. 在工具包(utils)下创建 JwtUtil 工具类

package com.ddz.utils;

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;

public class JwtUtil {

    //有效期为
    public static final Long JWT_TTL = 3600000L;// 60 * 60 *1000  一个小时

    //Jwt令牌信息
    public static final String JWT_KEY = "xzzb";

    public static String createJWT(String id, String subject, Long ttlMillis) {
        //指定算法
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

        //当前系统时间
        long nowMillis = System.currentTimeMillis();
        //令牌签发时间
        Date now = new Date(nowMillis);

        //如果令牌有效期为null,则默认设置有效期1小时
        if (ttlMillis == null) {
            ttlMillis = JwtUtil.JWT_TTL;
        }

        //令牌过期时间设置
        long expMillis = nowMillis + ttlMillis;
        Date expDate = new Date(expMillis);

        //生成秘钥
        SecretKey secretKey = generalKey();

        //封装Jwt令牌信息
        JwtBuilder builder = Jwts.builder()
                .setId(id)                    //唯一的ID
                .setSubject(subject)          // 主题  可以是JSON数据
                .setIssuer("admin")          // 签发者
                .setIssuedAt(now)             // 签发时间
                .signWith(signatureAlgorithm, secretKey) // 签名算法以及密匙
                .setExpiration(expDate);      // 设置过期时间
        return builder.compact();
    }

    /**
     * 生成加密 secretKey
     *
     * @return
     */
    public static SecretKey generalKey() {
        byte[] encodedKey = Base64.getEncoder().encode(JwtUtil.JWT_KEY.getBytes());
        SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
        return key;
    }

    public static void main(String[] args) {
        try {
            Claims claims = parseJWT("eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI3YWI1YWJjOS1hOTMzLTQxYTctYWUzNS1mYjhkMGQ5MzExM2MiLCJzdWIiOiJ7XCJuYW1lXCI6XCJhZG1pblwiLFwibmlja25hbWVcIjpcIuW8oOS4iVwiLFwicHdkXCI6XCIxMjNcIn0iLCJpc3MiOiJhZG1pbiIsImlhdCI6MTYwMDkzOTI3NywiZXhwIjoxNjAwOTQyODc3fQ.ifhUsi-4-KLeU2b7fK21JM5JwSuvzh2U3adnR264K2E");
            System.out.println(claims);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 解析令牌数据
     *
     * @param jwt
     * @return
     * @throws Exception
     */
    public static Claims parseJWT(String jwt) throws Exception {
        SecretKey secretKey = generalKey();
        return Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(jwt)
                .getBody();
    }
}

3. 创建测试类,运行main方法就能得出jwt令牌

Jwt令牌_jwt_02

package com.ddz.test;

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

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

public class JwtTest {
    public static void main(String[] args) throws Exception {
        String jwt = createJwt(); 
        System.out.println(jwt);
        parseJwt(jwt);
    }

    /**
     * @return 创建
     * @throws Exception
     */
    public static String createJwt() throws Exception {
        Map<String, Object> userInfo = new HashMap<>();
        userInfo.put("name", "张三");
        userInfo.put("age", 20);
        userInfo.put("address", "徐州解放路");

        JwtBuilder builder = Jwts.builder();
        builder.setId(UUID.randomUUID().toString());                         //设置唯一编号
        builder.setSubject("{'username':'admin','pwd':'123'}");              //设置主题  可以是JSON数据
        builder.addClaims(userInfo);
        builder.setIssuedAt(new Date());                                     //设置签发日期
        builder.setExpiration(new Date(System.currentTimeMillis() + 5000));  //设置有效时间
        builder.signWith(SignatureAlgorithm.HS256, "admin");              //设置签名 使用HS256算法,并设置SecretKey(字符串)
        return builder.compact();
    }

    /**
     * 解析jwt令牌存的用户数据
     *
     * @param jwtStr
     * @throws Exception
     */
    public static void parseJwt(String jwtStr) throws Exception {
        Claims claims = Jwts.parser().setSigningKey("admin").parseClaimsJws(jwtStr).getBody();
        System.out.println(claims);
    }
}

4. 模块测试

I. 在 UserServiceImpl 类下添加生成 jwt 的方法

Jwt令牌_jwt_03

  @Override
    public Map<String, Object> findUserLogin(String code) {
        Map<String, Object> dto = new HashMap<>();
        User user = null;
        if ("admin".equals(code)) {//测试数据
            user = new User();
            user.setId(1);
            user.setUserCode("ddz");
            user.setUserName("测试数据");
            user.setUserPassword("123");
            //生成jwt
            String jwt = JwtUtil.createJWT(UUID.randomUUID().toString(), JSON.toJSONString(user), null);
            System.out.println(jwt);                    //打印jwt令牌
            dto.put("status", "1001");
            dto.put("msg", "生成成功");
            dto.put("token", jwt);
            return dto;
        }
        dto.put("status", "1001");
        dto.put("msg", "生成失败");
        return dto;
    }

II. 在 controller 暴露API 接口

Jwt令牌_jwt_04

IV. 在 Postman 上测试

Jwt令牌_jwt_05