按照企業的項目然后寫的小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包含了verifyboolean 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方法中進行比對
?主要是業務邏輯有點復雜,實現起來其實很簡單