SpringBoot整合JWT

JWT

什么是token

按照一定规则生成的字符串,其中包含用户信息

什么是JwtJson web token

token的一种规则

JWT格式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hhP3hlev-1607869806973)(C:\Users\acer\AppData\Roaming\Typora\typora-user-images\image-20201213160817402.png)]

  • 红色部分::第一部分::Base64URL算法

    • jwt头信息
    {
      "alg": "HS256",
      "typ": "JWT"
    }
    
  • 紫色部分::第二部分::Base64URL算法

    • 有效载荷(包含主体信息)
 { 
  "iss": "Online JWT Builder",  //签发者
  "iat": 1416797419,            //签发时间
  "exp": 1448333419, 			//过期时间
  "aud": "www.example.com", 	//接收方
  "sub": "jrocket@example.com",	//面向的用户
  }
  • 蓝色部分::第三部分

    • 签名哈希(防伪标志)
    HMACSHA256(
      base64UrlEncode(header) + "." +
      base64UrlEncode(payload),
      secret)
    

项目使用

引入依赖

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

JWT工具类

package com.atguigu.commonutils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;

/**
 * @author helen
 * @since 2019/10/16
 */
public class JwtUtils {

    //设置token过期时间
    public static final long EXPIRE = 1000 * 60 * 60 * 24;
    //密钥:自定义
    public static final String APP_SECRET = "ukc8BDbRigUDaY6pZFfWus2jZWLPHO";

    /**
     * 生成token字符串
     * 
     * id:自定义设置传入的id值
     * nickname:自定义设置传入的nickeName值
     */                   
    public static String getJwtToken(String id, String nickname){
        //构建jwt字符串
        String JwtToken = Jwts.builder()
                //设置jwt头信息
                .setHeaderParam("typ", "JWT")
                .setHeaderParam("alg", "HS256")

				//面向的对象
                .setSubject("guli-user")
                //签发时间
                .setIssuedAt(new Date())
                //设置过期时间
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))

                //自定义设置token主体部分(key:value形式),存储用户信息
                .claim("id", id)
                .claim("nickname", nickname)

                //签名hash,根据HS256方式+自定义密钥
                .signWith(SignatureAlgorithm.HS256, APP_SECRET)
                //生成JWT
                .compact();

        return JwtToken;
    }

    /**
     * 判断token是否存在与有效
     */
    public static boolean checkToken(String jwtToken) {
        if(StringUtils.isEmpty(jwtToken)) return false;
        try {
            //根据自定义密钥进行解析传来的token信息
            Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 判断token是否存在与有效
     */
    public static boolean checkToken(HttpServletRequest request) {
        try {
            //将token信息放在请求头里面进行解析
            String jwtToken = request.getHeader("token");
            if(StringUtils.isEmpty(jwtToken)) return false;
            Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 根据token获取会员id
     */
    public static String getMemberIdByJwtToken(HttpServletRequest request) {
        String jwtToken = request.getHeader("token");
        if(StringUtils.isEmpty(jwtToken)) return "";
        Jws<Claims> claimsJws = Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
        //获取jwt的主体部分
        Claims claims = claimsJws.getBody();
        return (String)claims.get("id");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值