JWT令牌的生成和解析

JWT令牌

依赖导入


        <dependency>
            <groupId>io.jsonwebtokengroupId>
            <artifactId>jjwtartifactId>
            <version>0.9.1version>
        dependency>

令牌的生成

	/**
     * 生成JWT 令牌
     */
    @Test
    void testJWT() {
        Map<String, Object> claims = new HashMap<>();
        claims.put("id", 1);
        claims.put("name", "shisan");
        String jsw = Jwts.builder()
                .signWith(SignatureAlgorithm.HS256, "shisan") // 签名算法
                .setClaims(claims) // 自定义内容(载荷)
                .setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000)) // 设置令牌有效时间 1h
                .compact();
        System.out.println(jsw);
    }

解析JWT令牌

/**
     * 解析 Jwt令牌
     */
    @Test
    void testParseJwt() {
        Claims claims = Jwts.parser()
                .setSigningKey("shisan")
                .parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoic2hpc2FuIiwiaWQiOjEsImV4cCI6MTcwMDA1NzcxNX0.D2wD0f4Dl5UTAvYHtRK5I1GYtJ-YGqxPv2XeXMqSjK0")
                .getBody();
        System.out.println(claims);
    }

封装为一个工具类

package com.shisan.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;

public class JwtUtils {

    private static String signKey = "shisan";
    private static Long expire = 43200000L;

    /**
     * 生成JWT令牌
     * @param claims JWT第二部分负载 payload 中存储的内容
     * @return
     */
    public static String generateJwt(Map<String, Object> claims){
        String jwt = Jwts.builder()
                .addClaims(claims)
                .signWith(SignatureAlgorithm.HS256, signKey)
                .setExpiration(new Date(System.currentTimeMillis() + expire))
                .compact();
        return jwt;
    }

    /**
     * 解析JWT令牌
     * @param jwt JWT令牌
     * @return JWT第二部分负载 payload 中存储的内容
     */
    public static Claims parseJWT(String jwt){
        Claims claims = Jwts.parser()
                .setSigningKey(signKey)
                .parseClaimsJws(jwt)
                .getBody();
        return claims;
    }
}

LoginController

package com.shisan.controller;

import com.shisan.pojo.Emp;
import com.shisan.pojo.Result;
import com.shisan.service.EmpService;
import com.shisan.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

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

/**
 * @Author:shisan
 * @Date:2023/11/15 20:09
 */
@ServletComponentScan
@RestController
@Slf4j
public class LoginController {
    @Autowired
    private EmpService empService;

    @PostMapping("/login")
    public Result login(@RequestBody Emp emp) {
        Emp e = empService.login(emp);
        log.info("登陆的用户{}", emp);

        // 登录成功生成令牌
        if (e != null) {
            Map<String, Object> claims = new HashMap<>();
            claims.put("id", e.getId());
            claims.put("name", e.getName());
            claims.put("username", e.getUsername());

            String jwt = JwtUtils.generateJwt(claims);
            return Result.success(jwt);
        }
        return Result.error("用户名或密码错误");
    }
}

你可能感兴趣的:(java,开发语言)