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

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

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

Header.Payload.Signature

所谓读取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);

二、信息读取

每次前端请求后端,后端就可以读取里面的信息。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、pom.xml

<!--引入JWT-->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.10.0</version>
</dependency>

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);
}
}

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);
}
);