日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java客户端发送token_基于token的会话保持机制

發布時間:2025/4/5 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java客户端发送token_基于token的会话保持机制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

python數據可視化數據分析與決策

63.2元

(需用券)

去購買 >

session簡介

做過Web開發的程序員應該對Session都比較熟悉,Session是一塊保存在服務器端的內存空間,一般用于保存用戶的會話信息。

用戶通過用戶名和密碼登陸成功之后,服務器端程序會在服務器端開辟一塊Session內存空間并將用戶的信息存入這塊空間,同時服務器會

在cookie中寫入一個Session_id的值,這個值用于標識這個內存空間。

下次用戶再來訪問的話會帶著這個cookie中的session_id,服務器拿著這個id去尋找對應的session,如果session中已經有了這個用戶的

登陸信息,則說明用戶已經登陸過了。

使用Session保持會話信息使用起來非常簡單,技術也非常成熟。但是也存在下面的幾個問題:

服務器壓力大:通常Session是存儲在內存中的,每個用戶通過認證之后都會將session數據保存在服務器的內存中,而當用戶量增大時,服務器的壓力增大。

Session共享:現在很多應用都是分布式集群,需要我們做額外的操作進行Session共享;

CSRF跨站偽造請求攻擊:Session機制是基于瀏覽器端的cookie的,cookie如果被截獲,用戶就會很容易受到跨站請求偽造的攻擊。

基于token的認證

基于token的認證機制將認證信息返回給客戶端并存儲。下次訪問其他頁面,需要從客戶端傳遞認證信息回服務端。簡單的流程如下:

客戶端使用用戶名跟密碼請求登錄;

服務端收到請求,去驗證用戶名與密碼;

驗證成功后,服務端會簽發一個 Token,再把這個 Token 發送給客戶端;

客戶端收到 Token 以后可以把它存儲起來,比如放在 Cookie 里或者 Local Storage 里;

客戶端每次向服務端請求資源的時候需要帶著服務端簽發的 Token;

服務端收到請求,然后去驗證客戶端請求里面帶著的 Token,如果驗證成功,就向客戶端返回請求的數據;

基于token的驗證機制,有以下的優點:

支持跨域訪問,將token置于請求頭中,而cookie是不支持跨域訪問的;

無狀態化,服務端無需存儲token,只需要驗證token信息是否正確即可,而session需要在服務端存儲,一般是通過cookie中的sessionID在服務端查找對應的session;

無需綁定到一個特殊的身份驗證方案(傳統的用戶名密碼登陸),只需要生成的token是符合我們預期設定的即可;

更適用于移動端(Android,iOS,小程序等等),像這種原生平臺不支持cookie,比如說微信小程序,每一次請求都是一次會話,當然我們可以每次去手動為他添加cookie,詳情請查看博主另一篇博客;

避免CSRF跨站偽造攻擊,還是因為不依賴cookie;

缺點的話一個就是相比較于傳統的session登陸機制實現起來略微復雜一點,另外一個比較大的缺點是由于服務器不保存 token,因此無法在使用過程中廢止某個 token,或者更改 token 的權限。也就是說,一旦 token 簽發了,在到期之前就會始終有效,除非服務器部署額外的邏輯。

退出登陸的話,只要前端清除token信息即可。

基于JWT的token認證實現

JWT(JSON Web Token)就是基于token認證的代表,這邊就用JWT為列來介紹基于token的認證機制。

需要引入JWT的依賴

com.auth0

java-jwt

3.8.2

生成token和驗證token的工具類如下:

public class JWTTokenUtil {

//設置過期時間

private static final long EXPIRE_DATE=30*60*100000;

//token秘鑰

private static final String TOKEN_SECRET = "ZCfasfhuaUUHufguGuwu2020BQWE";

public static String token (String username,String password){

String token = "";

try {

//過期時間

Date date = new Date(System.currentTimeMillis()+EXPIRE_DATE);

//秘鑰及加密算法

Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);

//設置頭部信息

Map header = new HashMap<>();

header.put("typ","JWT");

header.put("alg","HS256");

//攜帶username,password信息,生成簽名

token = JWT.create()

.withHeader(header)

.withClaim("username",username)

.withClaim("password",password).withExpiresAt(date)

.sign(algorithm);

}catch (Exception e){

e.printStackTrace();

return null;

}

return token;

}

public static boolean verify(String token){

/**

* @desc 驗證token,通過返回true

* @params [token]需要校驗的串

**/

try {

Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);

JWTVerifier verifier = JWT.require(algorithm).build();

DecodedJWT jwt = verifier.verify(token);

return true;

}catch (Exception e){

e.printStackTrace();

return false;

}

}

public static void main(String[] args) {

String username ="name1";

String password = "pw1";

//注意,一般不會把密碼等私密信息放在payload中,這邊只是舉個列子

String token = token(username,password);

System.out.println(token);

boolean b = verify(token);

System.out.println(b);

}

}

執行結果如下:

Connected to the target VM, address: '127.0.0.1:11838', transport: 'socket'

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXNzd29yZCI6IjEyMyIsImV4cCI6MTU5NzM5Nzc0OCwidXNlcm5hbWUiOiJ6aGFuZ3NhbiJ9.LI5S_nX-YcqtExI9UtKiP8FPqpQW_ccaws2coLzyOS0

true

關于DecodedJWT這個類,大家可以重點看下,里面包含了解碼后的用戶信息。

JWT的使用說明

客戶端收到服務器返回的 JWT,可以儲存在 Cookie 里面,也可以儲存在 localStorage。

此后,客戶端每次與服務器通信,都要帶上這個 JWT。你可以把它放在 Cookie 里面自動發送,但是這樣不能跨域,所以更好的做法是放在 HTTP 請求的頭信息Authorization字段里面。

Authorization: Bearer

另一種做法是,跨域的時候,JWT 就放在 POST 請求的數據體里面。

JWT 本身包含了認證信息,一旦泄露,任何人都可以獲得該令牌的所有權限。為了減少盜用,JWT 的有效期應該設置得比較短。對于一些比較重要的權限,使用時應該再次對用戶進行認證。

為了減少盜用,JWT 不應該使用 HTTP 協議明碼傳輸,要使用 HTTPS 協議傳輸。(或者是對JWT在前后端之間進行加密之后在傳輸)

關于JWT的一個問題

上面生成JWT token的過程關鍵點就是密鑰,假如這個密鑰泄露了,那是不是就可以偽造token了。

還有就是生產環境的密鑰值,開發的程序員大概率是知道的,怎么防止程序要監守自盜,偽造token值呢?希望有經驗的大佬指教下。

//token秘鑰

private static final String TOKEN_SECRET = "ZCfasfhuaUUHufguGuwu2020BQWE";

參考

https://www.cnblogs.com/achengmu/p/12693260.html

https://www.cnblogs.com/ruoruchujian/p/11271285.html

JWT使用詳解

JWT官網

java 11官方入門(第8版)教材

79.84元

包郵

(需用券)

去購買 >

總結

以上是生活随笔為你收集整理的java客户端发送token_基于token的会话保持机制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。