众所周知,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