欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中的登錄技術(shù)保姆級(jí)詳細(xì)教程

 更新時(shí)間:2025年06月06日 11:18:20   作者:小白碼磚  
這篇文章主要介紹了Java中登錄技術(shù)保姆級(jí)詳細(xì)教程的相關(guān)資料,在Java中我們可以使用各種技術(shù)和框架來(lái)實(shí)現(xiàn)這些功能,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

登錄是每個(gè)項(xiàng)目中必不可少的一個(gè)環(huán)節(jié),也是十分重要的環(huán)節(jié),這篇文章將探討關(guān)于登錄的一些技術(shù)。

1.登錄思路

在講解登錄技術(shù)之前,先來(lái)看一下登錄校驗(yàn)的思路,前端發(fā)起請(qǐng)求,請(qǐng)求到底web服務(wù)器后,服務(wù)器會(huì)對(duì)請(qǐng)求進(jìn)行解析,符合要求,將數(shù)據(jù)響應(yīng)給瀏覽器。如下圖所示:

由于前端發(fā)送的請(qǐng)求是基于HTTP協(xié)議的,是無(wú)狀態(tài)的一種協(xié)議,無(wú)狀態(tài)協(xié)議就是最后一次請(qǐng)求不會(huì)攜帶前一次請(qǐng)求數(shù)據(jù)的狀態(tài),因此需要后端進(jìn)行數(shù)據(jù)的校驗(yàn)。因此當(dāng)瀏覽器發(fā)送請(qǐng)求給Web服務(wù)器的時(shí)候,此時(shí)后端會(huì)通過攔截器,統(tǒng)一將前端發(fā)送的請(qǐng)求攔截下來(lái),然后判斷請(qǐng)求是否有登錄標(biāo)記,請(qǐng)求中存入了登錄標(biāo)記,證明登錄過,則將對(duì)應(yīng)的請(qǐng)求放行訪問對(duì)應(yīng)的功能,反之沒有登陸過,則響應(yīng)對(duì)應(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ì)話中可以包含多次請(qǐng)求和響應(yīng),就像電話打通后,一人一句(一句話就是一個(gè)請(qǐng)求或響應(yīng))。

2.會(huì)話跟蹤

有了會(huì)話后,需要保證會(huì)話中的多次請(qǐng)求或響應(yīng)是來(lái)自同一個(gè)會(huì)話,即瀏覽器需要識(shí)別多次請(qǐng)求是否來(lái)自同一個(gè)瀏覽器,因此需要進(jìn)行會(huì)話跟蹤,就像登錄的時(shí)候輸入驗(yàn)證信息,獲取驗(yàn)證碼是一次請(qǐng)求,然后登錄是一次請(qǐng)求,登錄的時(shí)候校驗(yàn)驗(yàn)證碼是一次請(qǐng)求,從而實(shí)現(xiàn)同一次會(huì)話出現(xiàn)多次請(qǐng)求,所以需要會(huì)話跟蹤保證多次請(qǐng)求是一次會(huì)話中產(chǎn)生的,會(huì)話跟蹤技術(shù)有客戶端會(huì)話跟蹤技術(shù)--Cookie,服務(wù)端會(huì)話跟蹤技術(shù)---Session,以及令牌技術(shù)--JWT。

1.Cookie技術(shù)

Cookie技術(shù)即當(dāng)瀏覽器第一次發(fā)送請(qǐng)求到服務(wù)器后,如果登錄成功了,服務(wù)器會(huì)創(chuàng)建Cookie對(duì)象,將共享的數(shù)據(jù)放里面,向?yàn)g覽器響應(yīng)數(shù)據(jù)的時(shí)候,會(huì)將數(shù)據(jù)放到響應(yīng)頭中返回給前端,前端會(huì)將Cookie對(duì)象保存到瀏覽器本地中,下一次發(fā)送請(qǐng)求的時(shí)候,會(huì)將Cookie添加到請(qǐng)求頭中,從而通過請(qǐng)求傳遞給服務(wù)器,服務(wù)器下一次請(qǐng)求后,回去解析請(qǐng)求判斷Cookie是否存在,從而實(shí)現(xiàn)會(huì)話跟蹤。如圖所示:

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

跨域指的是,協(xié)議一致,域名不一致。當(dāng)前端發(fā)送登錄請(qǐng)求給服務(wù)器的時(shí)候,服務(wù)器的地址和前端發(fā)送的地址不在同一個(gè)域名里面就會(huì)出現(xiàn)跨域問題,此時(shí)Cookie就會(huì)失敗。

2.Session技術(shù)

Session技術(shù)是基于Cookie技術(shù)實(shí)現(xiàn)的,瀏覽器第一次發(fā)送請(qǐng)求,服務(wù)器會(huì)創(chuàng)建會(huì)話對(duì)象Session,向?yàn)g覽器響應(yīng)數(shù)據(jù)的時(shí)候,會(huì)將Session的唯一標(biāo)識(shí)Id,添加到響應(yīng)頭中去,瀏覽器獲取到響應(yīng)請(qǐng)求后,會(huì)將Session的Id保存下來(lái),下一次請(qǐng)求的時(shí)候,會(huì)將Id添加到請(qǐng)求頭中,然后服務(wù)器獲取到請(qǐng)求后,再去判斷請(qǐng)求頭中的Session的Id是否存在,從而實(shí)現(xiàn)會(huì)話跟蹤。

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

在集群環(huán)境下,無(wú)法直接使用Session原因在于,前端項(xiàng)目部署在Nginx上,Nginx將請(qǐng)求代理到后端服務(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并覆蓋原來(lái)的id,那么后續(xù)請(qǐng)求由交給第一個(gè)服務(wù)器處理,就會(huì)發(fā)現(xiàn)id對(duì)不上,因此這樣就達(dá)不到會(huì)話跟蹤,這就是集群環(huán)境下無(wú)法直接使用Session。

3.令牌技術(shù)

令牌技術(shù)即瀏覽器第一次發(fā)送請(qǐng)求的時(shí)候,服務(wù)器會(huì)給數(shù)據(jù)發(fā)一個(gè)令牌,下一次請(qǐng)求的時(shí)候,會(huì)攜帶令牌,服務(wù)器對(duì)令牌進(jìn)行校驗(yàn),判斷是否過期,沒有過期則放行訪問對(duì)應(yīng)的功能,反之重新登錄獲取令牌。如圖所示:

令牌技術(shù)的優(yōu)點(diǎn)在于可以支持PC端,移動(dòng)端,其次可以解決集群環(huán)境下的認(rèn)證問題,可以減輕服務(wù)器端存儲(chǔ)的壓力。

JWT令牌技術(shù)

1.概念

JWT全稱JSON Web Token(JSON Web Tokens - jwt.io)定義了一種簡(jiǎn)潔的,自包含的格式,用于在通信雙方以JSON數(shù)據(jù)格式安全的傳輸信息。JWT由三部分組成,第一部分:(Header頭),主要記錄令牌類型、簽名算法等,例如:{"alg":"HS256","type":"JWT"}。第二部分:Payload(有效載荷),主要攜帶一些自定義信息,默認(rèn)信息等,例如:{"id":"1","username":"Tom"}。第三部分:Signature(簽名),主要是用于防止Token被篡改,確保安全性。將header,payload融入,并加入指定的秘鑰,通過指定簽名算法計(jì)算而來(lái)。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令牌返回給前端即可,下次請(qǐng)求攜帶令牌就可訪問對(duì)應(yīng)的功能。

總結(jié)

到此這篇關(guān)于Java中的登錄技術(shù)的文章就介紹到這了,更多相關(guān)Java登錄技術(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java線程池的分析和使用詳解

    Java線程池的分析和使用詳解

    本篇文章主要介紹了Java線程池的分析和使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2021-11-11
  • IDEA如何查看代碼反匯編代碼

    IDEA如何查看代碼反匯編代碼

    這篇文章主要介紹了IDEA如何查看代碼反匯編代碼問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 詳解Spring Boot的GenericApplicationContext使用教程

    詳解Spring Boot的GenericApplicationContext使用教程

    這篇教程展示了如何在Spring應(yīng)用程序中使用GenericApplicationContext 。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2018-11-11
  • maven依賴傳遞和依賴沖突原理

    maven依賴傳遞和依賴沖突原理

    這篇文章主要介紹了maven依賴傳遞和依賴沖突原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • java如何實(shí)現(xiàn)post請(qǐng)求webservice服務(wù)端

    java如何實(shí)現(xiàn)post請(qǐng)求webservice服務(wù)端

    這篇文章主要介紹了java如何實(shí)現(xiàn)post請(qǐng)求webservice服務(wù)端,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringBoot+Thymeleaf靜態(tài)資源的映射規(guī)則說(shuō)明

    SpringBoot+Thymeleaf靜態(tài)資源的映射規(guī)則說(shuō)明

    這篇文章主要介紹了SpringBoot+Thymeleaf靜態(tài)資源的映射規(guī)則說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java遠(yuǎn)程調(diào)用組件Feign技術(shù)使用詳解

    Java遠(yuǎn)程調(diào)用組件Feign技術(shù)使用詳解

    Feign是Netflix公司開發(fā)的一個(gè)聲明式的REST調(diào)用客戶端; Ribbon負(fù)載均衡、 Hystrⅸ服務(wù)熔斷是我們Spring Cloud中進(jìn)行微服務(wù)開發(fā)非?;A(chǔ)的組件,在使用的過程中我們也發(fā)現(xiàn)它們一般都是同時(shí)出現(xiàn)的,而且配置也都非常相似
    2022-11-11
  • 解析ConcurrentHashMap: get、remove方法分析

    解析ConcurrentHashMap: get、remove方法分析

    ConcurrentHashMap是由Segment數(shù)組結(jié)構(gòu)和HashEntry數(shù)組結(jié)構(gòu)組成。Segment的結(jié)構(gòu)和HashMap類似,是一種數(shù)組和鏈表結(jié)構(gòu),今天給大家普及java面試常見問題---ConcurrentHashMap知識(shí),一起看看吧
    2021-06-06
  • Mybatis逆向工程時(shí)失敗問題及解決

    Mybatis逆向工程時(shí)失敗問題及解決

    這篇文章主要介紹了Mybatis逆向工程時(shí)失敗問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java中的數(shù)組排序方式(快速排序、冒泡排序、選擇排序)

    Java中的數(shù)組排序方式(快速排序、冒泡排序、選擇排序)

    這篇文章主要介紹了Java中的數(shù)組排序方式(快速排序、冒泡排序、選擇排序),需要的朋友可以參考下
    2014-02-02

最新評(píng)論