JWT 生成token

发布时间 2023-10-24 22:52:49作者: 小-伙计

创建一个springboot项目

导包

<dependency>
      <groupId>io.jsonwebtoken</groupId>
      <artifactId>jjwt</artifactId>
      <version>0.9.1</version>
</dependency>

创建 一个jwt工具类

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

import java.util.Date;

/**
 * @Author: xhj
 * @Date: 2023/10/19/21:13
 * @Description:
 */
public class JwtUtil {

    /**
     * 定义过期时间
     */
    private static final long EXPIRATION_TIME = 86400000L;

    /**
     * 生成token
     * @param subject
     * @return
     */
    public static String generateToken(String subject,String secretKey){ //secretKey 密钥
        return Jwts.builder()
                .setSubject(subject)  //表示JWT的主题,通常用于标识请求的发起者或用户
                .setIssuedAt(new Date())  //设置JWT的发行时间为当前时间
                .setExpiration(new Date(System.currentTimeMillis()+EXPIRATION_TIME)) //设置JWT的过期时间为当前时间加上预定义的EXPIRATION_TIME
                .signWith(SignatureAlgorithm.HS512,secretKey)  //使用HS512算法和传入的secretKey对JWT进行签名,以确保其安全性
                .compact();  //将JWT对象转换为紧凑的字符串表示形式
    }
    /**
     * 解析token,获取用户名
     * @param token
     * @return
     */
    public static String getSubjectFromToken(String token,String secretKey){
        Claims claims = Jwts.parser()
                .setSigningKey(secretKey)  //secretKey 密钥
                .parseClaimsJws(token) //生成的token
                .getBody();
        return claims.getSubject();
    }

}
创建一个controller类
import com.xhj.auth.util.JwtUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @Author: xhj
 * @Date: 2023/10/19/20:44
 * @Description:
 */
@RestController
@RequiredArgsConstructor
@RequestMapping("/token")
public class TokenController {

    /**
     * 获取密钥
     */
    @Value("${name}")
    private String SECRET_KEY;

    /**
     * 生成token
     * @param request
     * @param response
     * @return
     */
    @GetMapping("/getToken")
    public String token(HttpServletRequest request,HttpServletResponse response){
        // 生成token
        String token = JwtUtil.generateToken("xhj",SECRET_KEY);
        // 放入session
        request.getSession().setAttribute("token",token);
//        Cookie cookie = new Cookie("token",token);
//        response.addCookie(cookie);
        return token;
    }

    /**
     * 解析token 获取用户名
     * @param request
     * @return
     */
    @GetMapping("/analyzeToken")
    public String analyzeToken(HttpServletRequest request){
        String name = null;
        String token = (String) request.getSession().getAttribute("token");
        if (token!=null){
            name = JwtUtil.getSubjectFromToken(token,SECRET_KEY);
        }
        return name;
    }

}