按照企业的项目然后写的小demo, 自己搞一个登录接口然后调用jwtUtil工具类
后端实现
创建一个通用模块common来实现jwt生成token
登录注册的基本实现逻辑思路 面试| ProcessOn免费在线作图,在线流程图,在线思维导图
注释挺详细的jwtUtil工具类, 封装的类直接在你的登录login中调用里面的方法 进行传参
登录校验,生成token,以及怎么使用token拿到对应的值 三个方法
package com.javawa.train.common.util;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.json.JSONObject;
import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTPayload;
import cn.hutool.jwt.JWTUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Map;
public class JwtUtil {
private static final Logger LOG = LoggerFactory.getLogger(JwtUtil.class);
/**
* 盐值很重要,不能泄漏,且每个项目都应该不一样,可以放到配置文件中
*/
private static final String key = "zhou"; // 这个就是所说的 秘钥 每个项目不一样
/**
* 生成 token
* @param id
* @param mobile
* @return
*/
public static String createToken(Long id, String mobile) {
DateTime now = DateTime.now();
//
DateTime expTime = now.offsetNew(DateField.HOUR, 24);// 24小时
Map<String, Object> payload = new HashMap<>();
// 签发时间
payload.put(JWTPayload.ISSUED_AT, now);
// 过期时间
payload.put(JWTPayload.EXPIRES_AT, expTime);
// 生效时间
payload.put(JWTPayload.NOT_BEFORE, now);
// 内容
payload.put("id", id);
payload.put("mobile", mobile);
System.out.println(payload);
System.out.println(key.getBytes());
String token = JWTUtil.createToken(payload, key.getBytes());
LOG.info("生成JWT token:{}", token);
return token;
}
/**
* 校验 token 就是将请求头中 token进行比较
* @param token
* @return
*/
public static boolean validate(String token) {
JWT jwt = JWTUtil.parseToken(token).setKey(key.getBytes());
// validate包含了verify
boolean validate = jwt.validate(0);
LOG.info("JWT token校验结果:{}", validate);
return validate;
}
/**
* 通过 token拿到值
* @param token
* @return
*/
public static JSONObject getJSONObject(String token) {
JWT jwt = JWTUtil.parseToken(token).setKey(key.getBytes());
JSONObject payloads = jwt.getPayloads();
payloads.remove(JWTPayload.ISSUED_AT);
payloads.remove(JWTPayload.EXPIRES_AT);
payloads.remove(JWTPayload.NOT_BEFORE);
LOG.info("根据token获取原始内容:{}", payloads);
return payloads;
}
/**
* 可以自己验证一下可以不可以成功
* @param args
*/
public static void main(String[] args) {
createToken(1L, "123"); // id mobile 实体类
String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYmYiOjE3MDIyODY2ODYsIm1vYmlsZSI6IjEyMyIsImlkIjoxLCJleHAiOjE3MDIzNzMwODYsImlhdCI6MTcwMjI4NjY4Nn0.ZFXvFJQ_3YbqSWcMSwHUq3eH3GvBVcxSruZWMG1bfW4";
validate(token);
getJSONObject(token);
}
}
然后就是用户提交请求的时候需要携带Token信息,然后我们在controller中处理请求之前需要对token做出校验。如果验证通过就继续处理请求,否则就拦截该请求。
将生成的token与 main方法中进行比对
主要是业务逻辑有点复杂,实现起来其实很简单