JWT生成token工具類實現

JWT簡介

????????JWT定義 JWT全稱為Json web token,也就是 Json 格式的 web token
JWT數據結構

????????1.JWT由三段字符串組成,中間用.分隔

?Project_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxIiwiZXhwIjoxNzE2MzcwMTM0LCJpYXQiOjE3MTU3NjUzMzQsImp0aSI6IjllOTljMmUzOWZlMjQzZmE4ZjdhMjkzNmMxYjMwNmQ4In0.qTy7NFaaNkpzNnvAYpu6HZl_4TmjT1mNWuyCPEtUurQ

????????2.JWT 的三個部分依次如下:

Header(頭部)// Header 部分是一個 JSON 對象,描述 JWT 的元數據,通常是下面的樣子。
Payload(負載)// Payload 部分是一個 JSON 對象,用來存放實際需要傳遞的數據
Signature(簽名)// Signature 部分是對前兩部分的簽名,防止數據篡改

? ? ? ? ?3.第一段字符Header,Base64解碼后得到jwt的算法

{
?? ?"typ": "JWT", // TOKEN TYPE ,token類型
?? ?"alg": "HS256" ?//ALGORITHM,算法 哈希256
}

? ? ? ? ?4.第二段字符Payload,解析可得到我們自定義填充的一些數據信息

PAYLOAD是數據載體,可以有自定義數據
{
? "userId": "123456" // 自定義數據
}?


? ? ? ? ?5.第三段字符Signature

Signature 部分是對前兩部分的簽名,防止數據篡改。

?具體實現方法:

  • ? 導入jar
        <dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.8.1</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.16</version></dependency>

  • 封裝工具類

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.UUID;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.interfaces.DecodedJWT;
import java.util.Date;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.core.userdetails.UsernameNotFoundException;public class JwtTokenUtil {//過期時間public static final Long EXPIRATION = 604800l;// 密鑰 設置的越復雜越好public static final String SECRET = "ec15df77f55d819a3876f6543f7d89";//token前綴public static final String PREFIX = "Project_";public JwtTokenUtil() {}public static void main(String[] args) {System.out.println(generateToken("1"));}public static String generateToken(String userId) {return PREFIX + JWT.create().withSubject(userId).withIssuedAt(new Date()).withJWTId(UUID.fastUUID().toString(true)).withExpiresAt(generateExpirationDate()).sign(Algorithm.HMAC256(SECRET));}public static Date generateExpirationDate() {return new Date(System.currentTimeMillis() + (long)(EXPIRATION * 1000));}public boolean isTokenExpired(Date expiresAt) {return expiresAt.before(DateUtil.date());}public DecodedJWT decode(String token) {try {return JWT.decode(this.subStrToken(token));} catch (JWTDecodeException var3) {throw new BadCredentialsException("token 解析出錯", var3);}}public String getUserIdFromSubject(String subject) {try {if (StrUtil.isEmpty(subject)) {throw new UsernameNotFoundException("從token中無法解析出用戶ID");} else {String[] subjects = subject.split("#,#");String userName;if (ArrayUtil.isNotEmpty(subjects)) {userName = subjects[0];} else {userName = subject;}return userName;}} catch (Exception var4) {throw new BadCredentialsException("從token中解析用戶ID出錯", var4);}}public void verify(String token, String userId) {Algorithm algorithm = Algorithm.HMAC256(SECRET);JWTVerifier verifier = JWT.require(algorithm).withSubject(userId).build();verifier.verify(this.subStrToken(token));}private String subStrToken(String token) {if (token.startsWith(PREFIX)) {token = token.substring(PREFIX.length());}return token;}
}

  • 測試

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/13005.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13005.shtml
英文地址,請注明出處:http://en.pswp.cn/web/13005.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

cookie,session, token 的特點與區別

Cookie、Session 和 Token 在 Web 開發中扮演著不同的角色&#xff0c;各自具有特點和區別&#xff1a; Cookie 存儲在用戶的瀏覽器中&#xff0c;是由服務器發送到客戶端并存儲在客戶端的小型文本文件。可以包含有關用戶的信息&#xff0c;如身份驗證令牌、用戶偏好設置等。可…

MySQL觸發器 ,視圖索引 , 事務

MySQL進階二 補充觸發器知識 # 刪除觸發器代碼 drop trigger 觸發器名;# 當一個學員發生轉班&#xff0c;班級對應的總數進行同步變化# 當一個學員發生轉班&#xff0c;班級對應的總數進行同步變化delimiter !!create trigger movestudent after update on stu1 for each ROW…

力扣HOT100 - 152. 乘積最大子數組

解題思路&#xff1a; 方法一&#xff1a;暴力 class Solution {public int maxProduct(int[] nums) {int max Integer.MIN_VALUE;int s 1;for (int i 0; i < nums.length; i) {s 1;for (int j i ; j < nums.length; j) {s * nums[j];max Math.max(max, s);}}ret…

出國旅游常用英語,柯橋成人英語培訓

Where can I catch a taxi?哪里我可以叫到出租車&#xff1f; The taxi zone is right on the left corner over there.出租車站臺就在左邊轉角處。 Are you free?您有空嗎&#xff1f; Sure. Where are you going?當然。您要去哪里&#xff1f; Drive me back to Santa …

手工創建 kamailio database tables

有些場景可能kamdbctl create不好使&#xff0c;可能需要手工創建 kamailio database tables&#xff0c;可參考下面的命令序列&#xff1a; USE mysql # 刪除之前創建的用戶 SELECT user,host FROM user; DROP USER kamailio%; FLUSH PRIVILEGES; # 刪除之前創建的數據庫 DROP…

#Docker | Ngrok# 使用Ngrok和Docker進行內網穿透

一、注冊 Ngrok官網注冊&#xff0c;可以使用gmail或者outlook郵箱&#xff0c; 正常填寫后你會收到一封電子郵件&#xff0c;點擊郵件中鏈接即注冊成功 二、獲取密鑰 登錄&#xff0c;點擊Your Authtoken&#xff0c;最上面copy左邊就是你得密鑰 三、使用內網穿透啟動docker…

c++20---std::erase----std::erase_if

問題&#xff1a;如何刪除滿足條件的所有元素。 erase #include <iostream> #include <algorithm> #include <vector>int main(){std::vector<int> vec{1,2,3,1,1,1,1,1};std::erase(vec,1);for(int v:vec) std::cout<<v<<" "…

與禹老師學前端vue3學習匯總

24.5.15&#xff1a; 創建Vue3工程 1.確定自己電腦有沒有nodejs環境&#xff0c;在cmd中輸入node&#xff0c;如果出現Node.js的版本號說明已經有這個環境了&#xff0c;否則搜索Node.js安裝 2.先在D盤創建一個文件夾Vue3_Study&#xff0c;然后在這個空文件夾中右鍵選擇終端…

IPv6監測指標有哪些?如何才算真正完成IPv6的升級改造?

我國始終高度重視IPv6的發展建設&#xff0c;將IPv6視作未來互聯網發展的方向之一&#xff0c;自2017年《推進互聯網協議第六版&#xff08;IPv6&#xff09;規模部署行動計劃》印發以來&#xff0c;又多次發布IPv6相關的政策法規&#xff0c;以推進IPv6的規模化部署。在政策引…

首次曝光!我喂了半年主食凍干,喵狀態真滴頂~

科學養貓理念的推廣&#xff0c;使得主食凍干喂養越來越受到養貓者的歡迎。主食凍干不僅符合貓咪的自然飲食習慣&#xff0c;還能提供豐富的營養&#xff0c;有助于保持貓咪的口腔和消化系統健康。我家喂了半年主食凍干&#xff0c;貓咪的狀態是真的不一樣了&#xff01; 然而…

五豐黎紅引領新營銷模式:布局一物一碼數字化營銷,提高調味品銷量和復購率

調味品行業的銷售渠道主要有餐飲、家庭消費和食品加工&#xff0c;按銷售額的占比約為6&#xff1a;3&#xff1a;1&#xff0c;餐飲行業是調味品行業的供需主力。在餐飲行業中&#xff0c;“大廚”這一角色具有十分重要的地位。因此&#xff0c;借助大廚的力量成為了許多調味品…

TDL - field

hotline Desktop help TS M&O 1)to release app on Linux by commands, etc test development inventor

科林算法_4 基礎算法

一、排序 void swap(vector<int>& a, int x, int y) {if (x y)return;a[x] a[x] ^ a[y];a[y] a[x] ^ a[y];a[x] a[x] ^ a[y]; } 1.1 冒泡排序BubbleSort 核心思想&#xff1a;相鄰的兩個元素進行大小比較&#xff0c;若前者比后者大&#xff0c;則進行交換 每…

回文數[簡單]

優質博文&#xff1a;IT-BLOG-CN 一、題目 給你一個整數x&#xff0c;如果x是一個回文整數&#xff0c;返回true&#xff1b;否則返回false。回文數是指正序&#xff08;從左向右&#xff09;和倒序&#xff08;從右向左&#xff09;讀都是一樣的整數。例如&#xff0c;121是…

時間字符串處理 moment.js

文章來自我的blog moment.js 簡介 Moment.js 是一個開源的JavaScript庫&#xff0c;專為簡化日期和時間的處理而設計。它提供了一套豐富的API&#xff0c;允許開發者輕松地解析、驗證、操作、格式化日期和時間。自從2011年發布以來&#xff0c;Moment.js 因其易用性、靈活性和…

@Transactional(rollbackFor = Exception.class)注解放到private修飾的類上報錯

背景 有兩個方法中&#xff0c;更新數部分是相同的&#xff0c;打算把這一部分那重來&#xff0c;做一個公用的私有方法。 考慮數據一致性&#xff0c;原本每個方法都使用了Transactional(rollbackFor Exception.class)注解&#xff0c;保證失敗回滾&#xff0c;創建私有方法…

vj題單 激光炸彈 二維前綴和

題目鏈接&#xff1a;P2280 [HNOI2003] 激光炸彈 - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) 筆者答案&#xff1a; #include<stdio.h> int s[5005][5005]; int main () {int n,m;scanf("%d %d",&n,&m);int i,j;int x,y,v;int max;for(i 1;i &l…

洛谷P1364 醫院設置

P1364 醫院設置 題目描述 設有一棵二叉樹&#xff0c;如圖&#xff1a; 其中&#xff0c;圈中的數字表示結點中居民的人口。圈邊上數字表示結點編號&#xff0c;現在要求在某個結點上建立一個醫院&#xff0c;使所有居民所走的路程之和為最小&#xff0c;同時約定&#xff0c…

單元測試—BMI腳本設計

BMI例題如下&#xff1a; BMI中國計算標準&#xff1a;體質指數&#xff08;BMI&#xff09;體重&#xff08;kg&#xff09;身高^2&#xff08;m&#xff09; 例如&#xff1a;一個人的身高為1.75米,體重為68千克&#xff0c;他的BMI68/(1.75^2)22.2&#xff08;千克/米^2&a…

每日5題Day3 - LeetCode 11 - 15

每一步向前都是向自己的夢想更近一步&#xff0c;堅持不懈&#xff0c;勇往直前&#xff01; 第一題&#xff1a;11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int maxArea(int[] height) {//這道題比較特殊&#xff0c;因為兩邊是任意…