Java中的登錄技術(shù)保姆級詳細(xì)教程
登錄是每個(gè)項(xiàng)目中必不可少的一個(gè)環(huán)節(jié),也是十分重要的環(huán)節(jié),這篇文章將探討關(guān)于登錄的一些技術(shù)。
1.登錄思路
在講解登錄技術(shù)之前,先來看一下登錄校驗(yàn)的思路,前端發(fā)起請求,請求到底web服務(wù)器后,服務(wù)器會(huì)對請求進(jìn)行解析,符合要求,將數(shù)據(jù)響應(yīng)給瀏覽器。如下圖所示:

由于前端發(fā)送的請求是基于HTTP協(xié)議的,是無狀態(tài)的一種協(xié)議,無狀態(tài)協(xié)議就是最后一次請求不會(huì)攜帶前一次請求數(shù)據(jù)的狀態(tài),因此需要后端進(jìn)行數(shù)據(jù)的校驗(yàn)。因此當(dāng)瀏覽器發(fā)送請求給Web服務(wù)器的時(shí)候,此時(shí)后端會(huì)通過攔截器,統(tǒng)一將前端發(fā)送的請求攔截下來,然后判斷請求是否有登錄標(biāo)記,請求中存入了登錄標(biāo)記,證明登錄過,則將對應(yīng)的請求放行訪問對應(yīng)的功能,反之沒有登陸過,則響應(yīng)對應(yīng)信息給瀏覽器,讓用戶重新登錄即可。
2.登錄標(biāo)記
1.會(huì)話技術(shù)
會(huì)話就是當(dāng)瀏覽器打開訪問服務(wù)器資源的時(shí)候,就會(huì)建立會(huì)話,就類似與打電話,打通了就建立了會(huì)話,當(dāng)瀏覽器關(guān)閉或服務(wù)器關(guān)閉的時(shí)候,會(huì)話結(jié)束,一次會(huì)話中可以包含多次請求和響應(yīng),就像電話打通后,一人一句(一句話就是一個(gè)請求或響應(yīng))。
2.會(huì)話跟蹤
有了會(huì)話后,需要保證會(huì)話中的多次請求或響應(yīng)是來自同一個(gè)會(huì)話,即瀏覽器需要識別多次請求是否來自同一個(gè)瀏覽器,因此需要進(jìn)行會(huì)話跟蹤,就像登錄的時(shí)候輸入驗(yàn)證信息,獲取驗(yàn)證碼是一次請求,然后登錄是一次請求,登錄的時(shí)候校驗(yàn)驗(yàn)證碼是一次請求,從而實(shí)現(xiàn)同一次會(huì)話出現(xiàn)多次請求,所以需要會(huì)話跟蹤保證多次請求是一次會(huì)話中產(chǎn)生的,會(huì)話跟蹤技術(shù)有客戶端會(huì)話跟蹤技術(shù)--Cookie,服務(wù)端會(huì)話跟蹤技術(shù)---Session,以及令牌技術(shù)--JWT。
1.Cookie技術(shù)
Cookie技術(shù)即當(dāng)瀏覽器第一次發(fā)送請求到服務(wù)器后,如果登錄成功了,服務(wù)器會(huì)創(chuàng)建Cookie對象,將共享的數(shù)據(jù)放里面,向?yàn)g覽器響應(yīng)數(shù)據(jù)的時(shí)候,會(huì)將數(shù)據(jù)放到響應(yīng)頭中返回給前端,前端會(huì)將Cookie對象保存到瀏覽器本地中,下一次發(fā)送請求的時(shí)候,會(huì)將Cookie添加到請求頭中,從而通過請求傳遞給服務(wù)器,服務(wù)器下一次請求后,回去解析請求判斷Cookie是否存在,從而實(shí)現(xiàn)會(huì)話跟蹤。如圖所示:

任何技術(shù)都有利有弊,Cookie也不例外,Cookie技術(shù)的優(yōu)點(diǎn)在于是HTTP協(xié)議所支持的技術(shù),缺點(diǎn)就是1.移動(dòng)端APP無法使用Cookie,2.其次就是不安全,用戶可以自己禁用Cookie,3.Cookie不支持跨域。如圖所示:

跨域指的是,協(xié)議一致,域名不一致。當(dāng)前端發(fā)送登錄請求給服務(wù)器的時(shí)候,服務(wù)器的地址和前端發(fā)送的地址不在同一個(gè)域名里面就會(huì)出現(xiàn)跨域問題,此時(shí)Cookie就會(huì)失敗。
2.Session技術(shù)
Session技術(shù)是基于Cookie技術(shù)實(shí)現(xiàn)的,瀏覽器第一次發(fā)送請求,服務(wù)器會(huì)創(chuàng)建會(huì)話對象Session,向?yàn)g覽器響應(yīng)數(shù)據(jù)的時(shí)候,會(huì)將Session的唯一標(biāo)識Id,添加到響應(yīng)頭中去,瀏覽器獲取到響應(yīng)請求后,會(huì)將Session的Id保存下來,下一次請求的時(shí)候,會(huì)將Id添加到請求頭中,然后服務(wù)器獲取到請求后,再去判斷請求頭中的Session的Id是否存在,從而實(shí)現(xiàn)會(huì)話跟蹤。

Session技術(shù)優(yōu)點(diǎn)在于Session是存放在服務(wù)器端的,安全性高,缺點(diǎn)在于服務(wù)器在集群環(huán)境下無法直接使用Session,還是就是包括了Cookie的所有缺點(diǎn)。

在集群環(huán)境下,無法直接使用Session原因在于,前端項(xiàng)目部署在Nginx上,Nginx將請求代理到后端服務(wù)器上面的時(shí)候,存在負(fù)載均衡,因此當(dāng)?shù)谝淮蔚卿浀臅r(shí)候,Session存放在第一個(gè)服務(wù)器中,第二次登錄的時(shí)候,通過負(fù)載均衡,可能會(huì)交給第二個(gè)服務(wù)器進(jìn)行處理,但是第二個(gè)服務(wù)器還沒有Session的id,此時(shí)就會(huì)重新創(chuàng)建一個(gè)新的id并覆蓋原來的id,那么后續(xù)請求由交給第一個(gè)服務(wù)器處理,就會(huì)發(fā)現(xiàn)id對不上,因此這樣就達(dá)不到會(huì)話跟蹤,這就是集群環(huán)境下無法直接使用Session。
3.令牌技術(shù)
令牌技術(shù)即瀏覽器第一次發(fā)送請求的時(shí)候,服務(wù)器會(huì)給數(shù)據(jù)發(fā)一個(gè)令牌,下一次請求的時(shí)候,會(huì)攜帶令牌,服務(wù)器對令牌進(jìn)行校驗(yàn),判斷是否過期,沒有過期則放行訪問對應(yīng)的功能,反之重新登錄獲取令牌。如圖所示:

令牌技術(shù)的優(yōu)點(diǎn)在于可以支持PC端,移動(dòng)端,其次可以解決集群環(huán)境下的認(rèn)證問題,可以減輕服務(wù)器端存儲的壓力。
JWT令牌技術(shù)
1.概念
JWT全稱JSON Web Token(JSON Web Tokens - jwt.io)定義了一種簡潔的,自包含的格式,用于在通信雙方以JSON數(shù)據(jù)格式安全的傳輸信息。JWT由三部分組成,第一部分:(Header頭),主要記錄令牌類型、簽名算法等,例如:{"alg":"HS256","type":"JWT"}。第二部分:Payload(有效載荷),主要攜帶一些自定義信息,默認(rèn)信息等,例如:{"id":"1","username":"Tom"}。第三部分:Signature(簽名),主要是用于防止Token被篡改,確保安全性。將header,payload融入,并加入指定的秘鑰,通過指定簽名算法計(jì)算而來。JWT每個(gè)部分都是JSON格式。如圖所示:

2.JWT的生成與解析
首先需要引入JWT所需要的jjwt依賴。
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>其次可以通過Jwts的builder()方法構(gòu)建JWT令牌,通過Jwts的parser()方法解析JWT令牌。如下所示,是我創(chuàng)建的JWT工具類,包括了生成JWT和解析JWT兩部功能。
package com.itheima.utils;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;
/**
* @author Allen
* @version 1.0
* JWT令牌工具類
*/
public class JwtUtil {
//定義密鑰---秘鑰隨意定義即可
private static final String SECRET_KEY="OTkwMTAyOQ==";
//定義密鑰過期時(shí)間
private static final long EXPIRATION_TIME=12*60*60*1000;
//生成JWT令牌
public static String generateJWT(Map<String, Object> claims){
String Jwt = Jwts.builder()
/**
* 參數(shù)一:簽名算法,參數(shù)二:密鑰
*/
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
/**
* 參數(shù):Map集合,存放自定義的信息,一般是id,用戶名
*/
.addClaims(claims)
/**
* 參數(shù):傳入JWT有效的時(shí)間-----在當(dāng)前的時(shí)間上外后加設(shè)定的時(shí)間,因此需要獲取當(dāng)前的時(shí)間毫秒數(shù)。
*/
.setExpiration(new Date(EXPIRATION_TIME+System.currentTimeMillis()))
/**
*通過此方法生成JWT
*/
.compact();
return Jwt;
}
/**
*解析JWT
* 參數(shù):獲取生成的JWT令牌
*/
public static Claims parseJWT(String token){
Claims JWT = Jwts.parser()
/**
* 參數(shù):生成的密鑰
*/
.setSigningKey(SECRET_KEY)
/**
* 生成的JWT
*/
.parseClaimsJws(token)
/**
* 通過此方法解析JWT
*/
.getBody();
return JWT;
}
}
用戶登錄成功后,調(diào)用工具類里面的生成JWT方法,將用戶的信息封裝到Map集合中傳入,即可生成JWT令牌,將JWT令牌返回給前端即可,下次請求攜帶令牌就可訪問對應(yīng)的功能。
總結(jié)
到此這篇關(guān)于Java中的登錄技術(shù)的文章就介紹到這了,更多相關(guān)Java登錄技術(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java?Web實(shí)現(xiàn)簡易圖書管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java?Web實(shí)現(xiàn)簡易圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09
使用Spring Data JPA的坑點(diǎn)記錄總結(jié)
這篇文章主要給大家總結(jié)介紹了關(guān)于使用Spring Data JPA的一些坑點(diǎn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
Java中的Gradle與Groovy的區(qū)別及存在的關(guān)系
這篇文章主要介紹了Java中的Gradle與Groovy的區(qū)別及存在的關(guān)系,Groovy是一種JVM語言,它可以編譯為與Java相同的字節(jié)碼,并且可以與Java類無縫地互操作,Gradle是Java項(xiàng)目中主要的構(gòu)建系統(tǒng)之一,下文關(guān)于兩者的詳細(xì)內(nèi)容,需要的小伙伴可以參考一下2022-02-02
java中volatile關(guān)鍵字的作用與實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于java中volatile關(guān)鍵字的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
高可用架構(gòu)etcd選主故障主備秒級切換實(shí)現(xiàn)
這篇文章主要為大家介紹了高可用架構(gòu)etcd選主故障主備秒級切換的實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-02-02
Mybatis plus Dynamic Datasource 動(dòng)態(tài)數(shù)據(jù)源及使用
dynamic-datasource-spring-boot-starter是一個(gè)基于springboot的快速集成多數(shù)據(jù)源的啟動(dòng)器,它跟mybatis-plus是一個(gè)生態(tài)圈里的,很容易集成mybatis-plus,本文介紹Mybatis plus Dynamic Datasource 動(dòng)態(tài)數(shù)據(jù)源的相關(guān)知識,感興趣的朋友一起看看吧2025-09-09

