最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

單點(diǎn)登錄的三種方式和JWT的介紹與使用

 更新時(shí)間:2023年03月27日 15:33:37   作者:小威要向諸佬學(xué)習(xí)呀  
這篇文章主要說(shuō)明了單點(diǎn)登錄的三種方式和JWT的介紹與使用,加深自己的印象以及幫助的諸位小伙伴兒們,需要的朋友可以參考下

單點(diǎn)登錄三種方式

單點(diǎn)登錄的三種實(shí)現(xiàn)方式:

  • 分別為session廣播機(jī)制;
  • cookie+redis;
  • token

session廣播機(jī)制指在一個(gè)集群中的一個(gè)模塊登錄后,然后把該session復(fù)制成幾份,發(fā)送到該集群的其他模塊中,可以形成在個(gè)地方登錄,其他地方不用再登錄的效果。

session廣播機(jī)制

參與集群的每個(gè)節(jié)點(diǎn)的Session狀態(tài)都被復(fù)制到集群中的其他所有節(jié)點(diǎn)上,無(wú)論何時(shí),只要Session發(fā)生改變,Session數(shù)據(jù)都要重新被復(fù)制。Tomcat、JBoss等都提供了這樣的功能,其中Tomcat采用集群節(jié)點(diǎn)廣播復(fù)制,JBoss采用配對(duì)復(fù)制機(jī)制。

Session廣播機(jī)制優(yōu)缺點(diǎn):
優(yōu)點(diǎn):每個(gè)節(jié)點(diǎn)都復(fù)制一份Session,一個(gè)節(jié)點(diǎn)出現(xiàn)問(wèn)題時(shí)其它節(jié)點(diǎn)可以接替它的工作。
缺點(diǎn):節(jié)點(diǎn)間進(jìn)行Session同步會(huì)占據(jù)大量系統(tǒng)資源,整體性能隨著集群節(jié)點(diǎn)數(shù)的增加而下降。

cookie+redis方式

用戶在項(xiàng)目的任意一個(gè)模塊登錄后,登錄之后,該模塊會(huì)將用戶的登錄信息放到兩個(gè)地方:redis 和 cookie 中。

系統(tǒng)會(huì)先將用戶的登錄信息存入 redis中,其在 redis 的 key 值是生成的唯一值 (可以包含 ip、用戶 id、UUID等),value 值存放用戶的登錄信息。
接著系統(tǒng)會(huì)將這名用戶在 redis 中的 key 值存入該用戶的 cookie 中,用戶每次訪問(wèn)任意模塊時(shí)都會(huì)帶著這個(gè) cookie。
用戶在訪問(wèn)其他模塊發(fā)送請(qǐng)求時(shí),會(huì)帶著客戶端的 cookie 進(jìn)行請(qǐng)求,而客戶端的 cookie 已經(jīng)存入了該用戶在 redis 中的 key 值,這樣其他模塊在處理用戶的請(qǐng)求時(shí),可以先獲取用戶 cookie中的 key 值,然后拿著這個(gè) key 值到 redis 中進(jìn)行查詢(xún),如果在 redis 中能查詢(xún)到該用戶相應(yīng)的登錄信息,就說(shuō)明該用戶已登錄,就不需要用戶進(jìn)行重復(fù)登錄了。

token方式

token 是按照一定規(guī)則生成的字符串,字符串中可以包含用戶信息。開(kāi)發(fā)人員可以自行定制這個(gè)生成規(guī)則,也可以使用提供好的生成規(guī)則(如使用 JWT 自動(dòng)生成包含用戶信息的字符串)。

用戶在項(xiàng)目的某個(gè)模塊進(jìn)行登錄后,系統(tǒng)會(huì)按照一定(或定制)的規(guī)則生成字符串,把用戶登錄之后的信息包含到這個(gè)生成的字符串中,然后系統(tǒng)可以將這個(gè)字符串返回,主要有兩種返回方式:

1.可以把字符串通過(guò) cookie 返回;

2.可以把字符串通過(guò)地址欄返回。

這樣用戶在訪問(wèn)其他的模塊時(shí),每次訪問(wèn)的地址欄都會(huì)帶著生成的字符串成字符串),然后根據(jù)字符串獲取用戶信息,如果可以獲取到用戶的登錄信息,說(shuō)明該用戶已登錄,用戶就不需要重復(fù)登錄了。

JWT令牌介紹

JWT生成的字符串包括三部分:
1.JWT頭信息
2.有效載荷(包含頭部信息)
3.簽名哈希

JWT頭

JWT頭部分是一個(gè)描述JWT元數(shù)據(jù)的JSON對(duì)象,通常如下所示。

{
“alg”: “HS256”,
“type”: “JWT”
}

在上面的代碼中,alg屬性表示簽名使用的算法,默認(rèn)為HMAC SHA256(寫(xiě)為HS256);type屬性表示令牌的類(lèi)型,JWT令牌統(tǒng)一寫(xiě)為JWT。最后,使用Base64 URL算法將上述JSON對(duì)象轉(zhuǎn)換為字符串保存。

有效載荷

有效載荷部分,是JWT的主體內(nèi)容部分,也是一個(gè)JSON對(duì)象,包含需要傳遞的數(shù)據(jù)。 JWT指定七個(gè)默認(rèn)字段供選擇:

  • iss:發(fā)行人
  • exp:到期時(shí)間
  • sub:主題
  • aud:用戶
  • nbf:在此之前不可用
  • iat:發(fā)布時(shí)間
  • jti:JWT ID用于標(biāo)識(shí)該JWT

除以上默認(rèn)字段外,我們還可以自定義私有字段,如下例:

{
  "sub": "1234567890",
  "name": "xiaowei",
  "admin": true
}

默認(rèn)情況下JWT是未加密的,任何人都可以解讀其內(nèi)容,因此不要構(gòu)建隱私信息字段,存放保密信息,以防止信息泄露。

JSON對(duì)象也使用Base64 URL算法轉(zhuǎn)換為字符串保存。

簽名哈希

簽名哈希部分是對(duì)上面兩部分?jǐn)?shù)據(jù)簽名,通過(guò)指定的算法生成哈希,以確保數(shù)據(jù)不會(huì)被篡改。

首先,需要指定一個(gè)密碼(secret)。該密碼僅僅為保存在服務(wù)器中,并且不能向用戶公開(kāi)。然后,使用標(biāo)頭中指定的簽名算法(默認(rèn)情況下為HMAC SHA256)根據(jù)以下公式生成簽名。

JWT如何使用

JWT的原則

JWT的原則是在服務(wù)器身份驗(yàn)證之后,將生成一個(gè)JSON對(duì)象并將其發(fā)送回用戶,如下所示。

{
  "sub": "1234567890",
  "name": "xiaowei",
  "admin": true
}

之后,當(dāng)用戶與服務(wù)器通信時(shí),客戶在請(qǐng)求中發(fā)回JSON對(duì)象。服務(wù)器僅依賴(lài)于這個(gè)JSON對(duì)象來(lái)標(biāo)識(shí)用戶。為了防止用戶篡改數(shù)據(jù),服務(wù)器將在生成對(duì)象時(shí)添加簽名。

服務(wù)器不保存任何會(huì)話數(shù)據(jù),即服務(wù)器變?yōu)闊o(wú)狀態(tài),使其更容易擴(kuò)展。

JWT的用法

客戶端接收服務(wù)器返回的JWT,將其存儲(chǔ)在Cookie或localStorage中。

此后,客戶端將在與服務(wù)器交互中都會(huì)帶JWT。如果將它存儲(chǔ)在Cookie中,就可以自動(dòng)發(fā)送,但是不會(huì)跨域,因此一般是將它放入HTTP請(qǐng)求的Header Authorization字段中。當(dāng)跨域時(shí),也可以將JWT被放置于POST請(qǐng)求的數(shù)據(jù)主體中。

JWT的用處

JWT不僅可用于認(rèn)證,還可用于信息交換。善用JWT有助于減少服務(wù)器請(qǐng)求數(shù)據(jù)庫(kù)的次數(shù)。
生產(chǎn)的token可以包含基本信息,比如id、用戶昵稱(chēng)、頭像等信息,避免再次查庫(kù) 存儲(chǔ)在客戶端,不占用服務(wù)端的內(nèi)存資源
JWT默認(rèn)不加密,但可以加密。生成原始令牌后,可以再次對(duì)其進(jìn)行加密。 當(dāng)JWT未加密時(shí),一些私密數(shù)據(jù)無(wú)法通過(guò)JWT傳輸。
JWT的最大缺點(diǎn)是服務(wù)器不保存會(huì)話狀態(tài),所以在使用期間不可能取消令牌或更改令牌的權(quán)限。也就是說(shuō),一旦JWT簽發(fā),在有效期內(nèi)將會(huì)一直有效。
JWT本身包含認(rèn)證信息,token是經(jīng)過(guò)base64編碼,所以可以解碼,因此token加密前的對(duì)象不應(yīng)該包含敏感信息,一旦信息泄露,任何人都可以獲得令牌的所有權(quán)限。為了減少盜用,JWT的有效期不宜設(shè)置太長(zhǎng)。對(duì)于某些重要操作,用戶在使用時(shí)應(yīng)該每次都進(jìn)行進(jìn)行身份驗(yàn)證。
為了減少盜用和竊取,JWT不建議使用HTTP協(xié)議來(lái)傳輸代碼,而是使用加密的HTTPS協(xié)議進(jìn)行傳輸。

整合JWT令牌

首先在項(xiàng)目中添加依賴(lài):

<dependencies>
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
    </dependency>
</dependencies>

創(chuàng)建JWT的工具類(lèi)

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm; 
import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;

public class JwtUtils {
 public static final long EXPIRE = 1000 * 60 * 60 * 24;
 public static final String APP_SECRET = "zkdlh8Ycvxmwd9sDxzc8czxcascX9";
 
 public static String getJwtToken(String id, String nickname){
 
 String JwtToken = Jwts.builder()
 
 .setHeaderParam("type", "JWT")
 
 .setHeaderParam("alg", "HS256")
 
 .setSubject("guli-user")
 
 .setIssuedAt(new Date())
 
 .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
 
 .claim("id", id)
 
 .claim("nickname", nickname)
 
 .signWith(SignatureAlgorithm.HS256, APP_SECRET)
 
 .compact();
 
 
 return JwtToken;
 
 }
 
 /**
 
 * 判斷token是否存在與有效
 
 * @param jwtToken
 
 * @return
 
 */
 
 public static boolean checkToken(String jwtToken) {
 
 if(StringUtils.isEmpty(jwtToken)) return false;
 
 try {
 
 Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
 
 } catch (Exception e) {
 
 e.printStackTrace();
 
 return false;
 
 }
 
 return true;
 
 }
  
 /**
 
 * 判斷token是否存在與有效
 
 * @param request
 
 * @return
 
 */
 
 public static boolean checkToken(HttpServletRequest request) {
 
 try {
 
 String jwtToken = request.getHeader("token");
 
 if(StringUtils.isEmpty(jwtToken)) return false;
 
 Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
 
 } catch (Exception e) {
 
 e.printStackTrace();
 
 return false;
 
 } 
 return true; 
 }
 
 
 /**
 
 * 根據(jù)token獲取id
 
 * @param request
 
 * @return
 
 */
 
 public static String getMemberIdByJwtToken(HttpServletRequest request) {
 
 String jwtToken = request.getHeader("token");
 
 if(StringUtils.isEmpty(jwtToken)) return "";
 
 Jws<Claims> claimsJws = Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
 
 Claims claims = claimsJws.getBody();
 
 return (String)claims.get("id");
 
 }
 
}

到此這篇關(guān)于單點(diǎn)登錄的三種方式和JWT的介紹與使用的文章就介紹到這了,更多相關(guān)單點(diǎn)登錄和JWT的介紹內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在spring中使用自定義注解注冊(cè)監(jiān)聽(tīng)器的方法

    在spring中使用自定義注解注冊(cè)監(jiān)聽(tīng)器的方法

    本篇文章主要介紹了在spring中使用自定義注解注冊(cè)監(jiān)聽(tīng)器的方法,本文就是在分析監(jiān)聽(tīng)器回調(diào)原理的基礎(chǔ)上,在spring環(huán)境中使用自定義的注解實(shí)現(xiàn)一個(gè)監(jiān)聽(tīng)器。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • Springboot之idea之pom文件圖標(biāo)不對(duì)問(wèn)題

    Springboot之idea之pom文件圖標(biāo)不對(duì)問(wèn)題

    這篇文章主要介紹了Springboot之idea之pom文件圖標(biāo)不對(duì)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Java數(shù)字簽名算法DSA實(shí)例詳解

    Java數(shù)字簽名算法DSA實(shí)例詳解

    這篇文章主要介紹了Java數(shù)字簽名算法DSA,結(jié)合實(shí)例形式分析了Java數(shù)字簽名算法DSA具體定義與使用技巧,需要的朋友可以參考下
    2018-05-05
  • SpringBoot之那些注入不了的Spring占位符(${}表達(dá)式)問(wèn)題

    SpringBoot之那些注入不了的Spring占位符(${}表達(dá)式)問(wèn)題

    這篇文章主要介紹了SpringBoot之那些注入不了的Spring占位符(${}表達(dá)式)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • SpringBoot中DTO/VO/Entity相互轉(zhuǎn)換詳解

    SpringBoot中DTO/VO/Entity相互轉(zhuǎn)換詳解

    在我們平時(shí)開(kāi)發(fā)中,dto、vo、entity之間的相互轉(zhuǎn)換是很頻繁的操作,這篇文章就簡(jiǎn)單記錄一下在平時(shí)開(kāi)發(fā)中SpringBoot的轉(zhuǎn)換方法,希望對(duì)大家有所幫助
    2025-01-01
  • MyBatis基于pagehelper實(shí)現(xiàn)分頁(yè)原理及代碼實(shí)例

    MyBatis基于pagehelper實(shí)現(xiàn)分頁(yè)原理及代碼實(shí)例

    這篇文章主要介紹了MyBatis基于pagehelper實(shí)現(xiàn)分頁(yè)原理及代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Java?Web防止同一用戶同時(shí)登錄幾種常見(jiàn)的實(shí)現(xiàn)方式

    Java?Web防止同一用戶同時(shí)登錄幾種常見(jiàn)的實(shí)現(xiàn)方式

    在JavaWeb開(kāi)發(fā)中,實(shí)現(xiàn)同一賬號(hào)同一時(shí)間只能在一個(gè)地點(diǎn)登錄的功能,主要目的是為了增強(qiáng)系統(tǒng)的安全性,防止用戶賬戶被他人惡意登錄或同時(shí)在多個(gè)設(shè)備上使用,這篇文章主要給大家介紹了關(guān)于Java?Web防止同一用戶同時(shí)登錄幾種常見(jiàn)的實(shí)現(xiàn)方式,需要的朋友可以參考下
    2024-08-08
  • Spring中三種常見(jiàn)Bean的初始化參數(shù)機(jī)制你了解嗎

    Spring中三種常見(jiàn)Bean的初始化參數(shù)機(jī)制你了解嗎

    在Spring框架中,Bean的實(shí)例化與初始化是一個(gè)復(fù)雜的過(guò)程,本文我們主要來(lái)聊一聊它的常見(jiàn)的三種機(jī)制:InitializingBean接口、BeanDefinitionRegistryPostProcessor接口和EnvironmentAware接口,感興趣的小伙伴可以了解下
    2023-11-11
  • spring boot使用RabbitMQ實(shí)現(xiàn)topic 主題

    spring boot使用RabbitMQ實(shí)現(xiàn)topic 主題

    本篇文章主要介紹了spring boot使用RabbitMQ實(shí)現(xiàn)topic 主題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • Spring Boot 如何使用Liquibase 進(jìn)行數(shù)據(jù)庫(kù)遷移(操作方法)

    Spring Boot 如何使用Liquibase 進(jìn)行數(shù)據(jù)庫(kù)遷移(操作方法)

    在Spring Boot應(yīng)用程序中使用Liquibase進(jìn)行數(shù)據(jù)庫(kù)遷移是一種強(qiáng)大的方式來(lái)管理數(shù)據(jù)庫(kù)模式的變化,本文重點(diǎn)講解如何在Spring Boot應(yīng)用程序中使用Liquibase進(jìn)行數(shù)據(jù)庫(kù)遷移,從而更好地管理數(shù)據(jù)庫(kù)模式的變化,感興趣的朋友跟隨小編一起看看吧
    2023-09-09

最新評(píng)論

曲靖市| 葵青区| 神木县| 崇义县| 甘孜| 芒康县| 岚皋县| 沂水县| 奉节县| 禄丰县| 周口市| 蓬莱市| 工布江达县| 新绛县| 丰镇市| 平利县| 抚远县| 宜川县| 乌海市| 纳雍县| 涿鹿县| 庄浪县| 怀仁县| 永德县| 太保市| 封开县| 肃宁县| 阿尔山市| 景宁| 明光市| 长子县| 淅川县| 宝鸡市| 麻江县| 临湘市| 图木舒克市| 古田县| 囊谦县| 华亭县| 塘沽区| 左贡县|