关键词搜索

源码搜索 ×
×

读取jwt里负载的信息

发布2022-11-24浏览1153次

详情内容

众所周知,JWT 的三个部分依次如下:

Header(头部) ,
元数据描述 Payload(负载) ,
传输的数据 Signature(签名),Header + Payload的签名

写成一行,就是下面的样子

Header.Payload.Signature
  • 1

所谓读取jwt负载的信息,就是读取payload里的信息。

一、信息写入

首先,生成token时,要将信息写入payload。

Map<String, String> payload = new HashMap<>();
payload.put("time", System.currentTimeMillis() + "");
payload.put("userId",user.getUserid().toString());//写入用户ID
//生成JWT令牌
String token = JwtUtils.getToken(payload);
  • 1
  • 2
  • 3
  • 4
  • 5

二、信息读取

每次前端请求后端,后端就可以读取里面的信息。jwt的token,都要附在request的header里。

import com.auth0.jwt.interfaces.DecodedJWT;

public User getCurUser() {
    User user = null;

    HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    String token = request.getHeader("authorization");
    if(token != null) {
        token = token.split(" ")[1];
        DecodedJWT dtoken = JwtUtils.getToken(token);
        String userId = dtoken.getClaim("userId").asString();
        user = queryById(Integer.parseInt(userId));
    }

    return user;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

三、附录

1、pom.xml

<!--引入JWT-->
<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.10.0</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2、工具类JwtUtils

package com.landtool.szdata.modules.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.*;

public class JwtUtils {
    private static String SIGNATURE = "你的密钥";

    /**
     * 生成token
     * @param map //传入payload
     * @return 返回token
     */
    public static String getToken(Map<String,String> map){
        JWTCreator.Builder builder = JWT.create();
        map.forEach((k,v)->{
            builder.withClaim(k,v);
        });
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.HOUR,1);
        builder.withExpiresAt(instance.getTime());
        return builder.sign(Algorithm.HMAC256(SIGNATURE)).toString();
    }

    /**
     * 验证token
     * @param token
     */
    public static void verify(String token){
        JWT.require(Algorithm.HMAC256(SIGNATURE)).build().verify(token);
    }

    /**
     * 获取token中payload
     * @param token
     * @return
     */
    public static DecodedJWT getToken(String token){
        return JWT.require(Algorithm.HMAC256(SIGNATURE)).build().verify(token);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

3、前端请求,附上jwt token

import axios from "axios";

// 创建一个 axios 实例
const service = axios.create({
  baseURL: "/api", // 所有的请求地址前缀部分
  timeout: 60000, // 请求超时时间毫秒
  withCredentials: true, // 异步请求携带cookie
  headers: {
    // 设置后端需要的传参类型
    "Content-Type": "application/json",
    //'token': 'your token',
    "X-Requested-With": "XMLHttpRequest",
  },
});

// 添加请求拦截器
service.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    const token = getToken();//这个token就是jwt的token,前端保存在cookie或localStorage
    if (token) {
      config.headers["Authorization"] = "Bearer " + token;
    }
    return config;
  },
  function (error) {
    // 对请求错误做些什么
    console.log(error);
    return Promise.reject(error);
  }
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

相关文章
SpringBoot采用jwt作为REST API安全机制的应用示例

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载