(企业 / 公司项目) 企业项目如何使用jwt?

按照企业的项目然后写的小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方法中进行比对

主要是业务逻辑有点复杂,实现起来其实很简单

相关推荐
非 白15 分钟前
【Java】代理模式
java·开发语言·代理模式
Good Note25 分钟前
Golang的静态强类型、编译型、并发型
java·数据库·redis·后端·mysql·面试·golang
m0_7482365841 分钟前
跟据spring boot版本,查看对应的tomcat,并查看可支持的tomcat的版本范围
spring boot·后端·tomcat
web151173602231 小时前
Spring Boot项目中解决跨域问题(四种方式)
spring boot·后端·dubbo
我就是我3521 小时前
记录一次SpringMVC的406错误
java·后端·springmvc
向哆哆1 小时前
Java应用程序的跨平台性能优化研究
java·开发语言·性能优化
ekkcole2 小时前
windows使用命令解压jar包,替换里面的文件。并重新打包成jar包,解决Failed to get nested archive for entry
java·windows·jar
翱翔-蓝天2 小时前
Spring Boot 3 集成 RabbitMQ 实践指南
spring boot·rabbitmq·java-rabbitmq
luckilyil2 小时前
RabbitMQ学习—day6—springboot整合
spring boot·rabbitmq·java-rabbitmq
handsomestWei2 小时前
java实现多图合成mp4和视频附件下载
java·开发语言·音视频·wutool·图片合成视频·视频附件下载