(企业 / 公司项目) 企业项目如何使用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方法中进行比对

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

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-12 01:26:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-12 01:26:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-12 01:26:02       82 阅读
  4. Python语言-面向对象

    2023-12-12 01:26:02       91 阅读

热门阅读

  1. Codeforces Round 900 (Div. 3)补题

    2023-12-12 01:26:02       71 阅读
  2. Socket.D 网络应用协议,v2.1.6 发布

    2023-12-12 01:26:02       61 阅读
  3. tmux常见会话管理命令

    2023-12-12 01:26:02       53 阅读
  4. useMemo和useCallback

    2023-12-12 01:26:02       58 阅读
  5. Vue 3实现的移动端两指控制图片缩放功能

    2023-12-12 01:26:02       71 阅读
  6. 简单实用的firewalld命令

    2023-12-12 01:26:02       44 阅读
  7. 鸿蒙(HarmonyOS)应用开发——web组件

    2023-12-12 01:26:02       63 阅读
  8. leetcode第119场双周赛 - 2023 - 12 - 9

    2023-12-12 01:26:02       61 阅读
  9. Redis研学-认识与安装

    2023-12-12 01:26:02       50 阅读
  10. 力扣373. 查找和最小的 K 对数字

    2023-12-12 01:26:02       50 阅读
  11. 通义千问测试

    2023-12-12 01:26:02       55 阅读