【JavaWeb】登錄校驗-會話技術(一)Cookie與Session

登錄校驗

實現登陸后才能訪問后端系統頁面,不登陸則跳轉登陸頁面進行登陸。

首先我們在宏觀上先有一個認知:

HTTP協議是無狀態協議。即每一次請求都是獨立的,下一次請求并不會攜帶上一次請求的數據。
因此當我們通過瀏覽器訪問登錄后,接下來我們執行其他業務操作時,服務器無法判斷用戶是否登錄。

那應該怎么來實現登錄校驗的操作呢?具體的實現思路可以分為兩部分:

  1. 在登錄成功后,需要將用戶登錄成功的信息存起來,記錄用戶已經登錄成功的標記。
  2. 在瀏覽器發起請求時,需要在服務端進行統一攔截,攔截后進行登錄校驗。

如果在每一個功能中都添加判斷邏輯就會出現相同代碼邏輯,每個功能都需要編寫,就會造成代碼非常繁瑣。
為了簡化這塊操作,我們可以使用:統一攔截技術

統一攔截技術:
攔截瀏覽器發送過來的所有請求,攔截后通過請求來獲取之前所存入的登錄標記。,以此判斷是否放行。

我們要完成以上操作,會涉及到web開發中的兩個技術:

  1. 會話技術
  2. 統一攔截技術
  • Servlet規范中的Filter過濾器
  • Spring提供的interceptor攔截器
    在這里插入圖片描述

會話技術

什么是會話?

  • 瀏覽器與服務器之間的一次連接,我們就稱為一次會話。
  • 用戶打開瀏覽器,訪問wb服務器的資源,會話建立,直到有一方斷開連接,會話結束。
  • 在一次會話中可以包含多次請求和響應。

會話跟蹤

會話跟蹤:一種維護瀏覽器狀態的方法,服務器需要識別多次請求是否來自于同一瀏覽器,以便在同一次會話的多次請求間共享數據。
識別多次請求是否來自于同一瀏覽器的過程,我們就稱為會話跟蹤

為什么要共享數據呢?
由于HTTP是無狀態協議,在后面請求中怎么拿到前一次請求生成的數據呢?此時就需要在一次會話的多次請求之間進行數據共享

會話跟蹤技術有三種:

  1. Cookie(客戶端會話跟蹤技術)
    • 數據存儲在客戶端瀏覽器
  2. Session(服務端會話跟蹤技術)
    • 數據存儲在服務端
  3. 令牌技術
會話跟蹤方案

在這里插入圖片描述

方案一:Cookie

cookie 是客戶端會話跟蹤技術,它是存儲在客戶端瀏覽器的,我們使用 cookie 來跟蹤會話,就可以在瀏覽器第一次發起請求來請求服務器的時候,我們在服務器端來設置一個cookie。
在 cookie 當中我們可以來存儲用戶相關的一些數據信息。比如當前登錄用戶的用戶名,用戶的ID。

服務器端在給客戶端在響應數據的時候

  • 自動的將 cookie 響應給瀏覽器。
  • 瀏覽器接收到響應回來的 cookie 之后,會自動將 cookie 的值存儲在瀏覽器本地。
  • 在后續的每一次請求當中,瀏覽器會自動將 cookie 攜帶到服務器端。

通過獲取到的 cookie 值我們就可以判斷當前用戶是否登錄。

為什么這一切都是自動化進行的?
因為 cookie 它是 HTTP 協議當中所支持的技術,而各大瀏覽器廠商都支持了這一標準。在 HTTP 協議官方給我們提供了一個響應頭和請求頭:

  • 響應頭 Set-Cookie :設置Cookie數據
  • 請求頭 Cookie:攜帶Cookie數據

代碼演示

@Slf4j
@RestController
public class SessionController {//設置Cookie@GetMapping("/c1")public Result cookie1(HttpServletResponse response){response.addCookie(new Cookie("login_username","itheima")); //設置Cookie/響應Cookiereturn Result.success();}//獲取Cookie@GetMapping("/c2")public Result cookie2(HttpServletRequest request){Cookie[] cookies = request.getCookies();for (Cookie cookie : cookies) {if(cookie.getName().equals("login_username")){System.out.println("login_username: "+cookie.getValue()); //輸出name為login_username的cookie}}return Result.success();}
} 
  1. 訪問c1接口,設置Cookie,http://localhost:8080/c1
    在這里插入圖片描述

我們可以看到,設置的cookie,通過響應頭Set-Cookie響應給瀏覽器,并且瀏覽器會將Cookie,存儲在瀏覽器端。
在這里插入圖片描述

  1. 訪問c2接口 http://localhost:8080/c2,此時瀏覽器會自動的將Cookie攜帶到服務端,是通過請求頭Cookie,攜帶的。
    在這里插入圖片描述

優缺點

  • 優點:HTTP協議中支持的技術(像Set-Cookie 響應頭的解析以及 Cookie 請求頭數據的攜帶,都是瀏覽器自動進行的,是無需我們手動操作的)
  • 缺點:
    • 移動端APP(Android、IOS)中無法使用Cookie
    • 不安全,用戶可以自己禁用Cookie
    • Cookie不能跨域

跨域介紹:
在這里插入圖片描述

  • 現在的項目,大部分都是前后端分離的,前后端最終也會分開部署,前端部署在服務器 192.168.150.200 上,端口 80,后端部署在 192.168.150.100上,端口 8080
  • 我們打開瀏覽器直接訪問前端工程,訪問url:http://192.168.150.200/login.html
  • 然后在該頁面發起請求到服務端,而服務端所在地址不再是localhost,而是服務器的IP地址192.168.150.100,假設訪問接口地址為:http://192.168.150.100:8080/login
  • 那此時就存在跨域操作了,因為我們是在 http://192.168.150.200/login.html 這個頁面上訪問了http://192.168.150.100:8080/login 接口
  • 此時如果服務器設置了一個Cookie,這個Cookie是不能使用的,因為Cookie無法跨域

區分跨域的維度:

  • 協議
  • IP/協議
  • 端口
    只要上述的三個維度有任何一個維度不同,那就是跨域操作
示例是否跨域及原因
http://192.168.150.200/login.html ----------> https://192.168.150.200/login協議不同,跨域
http://192.168.150.200/login.html ----------> http://192.168.150.100/loginIP不同,跨域
http://192.168.150.200/login.html ----------> http://192.168.150.200:8080/login端口不同,跨域
http://192.168.150.200/login.html ----------> http://192.168.150.200/login不跨域
方案二:Session

Session 的底層其實就是基于剛才所介紹的 Cookie 來實現的。

  • 獲取Session
    在這里插入圖片描述

    • 瀏覽器在第一次請求服務器的時候,我們就可以直接在服務器當中來獲取到會話對象Session。
    • 如果是第一次請求Session ,會話對象是不存在的,這個時候服務器會自動的創建一個會話對象Session 。
    • 每一個會話對象Session ,它都有一個ID(示意圖中Session后面括號中的1,就表示ID),我們稱之為 Session 的ID。
  • 響應Cookie (JSESSIONID)
    在這里插入圖片描述

    • 服務器端在給瀏覽器響應數據的時候,它會將 Session 的 ID 通過 Cookie 響應給瀏覽器。
    • 在響應頭當中增加了一個 Set-Cookie 響應頭。這個 Set-Cookie 響應頭對應的值是cookie,cookie 的名字是固定的 JSESSIONID 代表的服務器端會話對象 Session 的 ID。
    • 瀏覽器會自動識別這個響應頭,然后自動將Cookie存儲在瀏覽器本地。
  • 查找Session
    在這里插入圖片描述

    • 接下來,在后續的每一次請求當中,都會將 Cookie 的數據獲取出來,并且攜帶到服務端。接下來服務器拿到JSESSIONID這個 Cookie 的值,也就是 Session 的ID。拿到 ID 之后,就會從眾多的 Session 當中來找到當前請求對應的會話對象Session。

這樣就可以通過 Session 會話對象在同一次會話的多次請求之間來共享數據了,這就是基于 Session 進行會話跟蹤的流程。

代碼演示

@Slf4j
@RestController
public class SessionController {@GetMapping("/s1")public Result session1(HttpSession session){log.info("HttpSession-s1: {}", session.hashCode());session.setAttribute("loginUser", "tom"); //往session中存儲數據return Result.success();}@GetMapping("/s2")public Result session2(HttpServletRequest request){HttpSession session = request.getSession();log.info("HttpSession-s2: {}", session.hashCode());Object loginUser = session.getAttribute("loginUser"); //從session中獲取數據log.info("loginUser: {}", loginUser);return Result.success(loginUser);}
}
  1. 訪問 s1 接口,http://localhost:8080/s1
    在這里插入圖片描述

請求完成之后,在響應頭中,就會看到有一個Set-Cookie的響應頭,里面響應回來了一個Cookie,就是JSESSIONID,這個就是服務端會話對象 Session 的ID。

  1. 訪問 s2 接口,http://localhost:8080/s2
    在這里插入圖片描述

接下來,在后續的每次請求時,都會將Cookie的值,攜帶到服務端,服務端接收到Cookie之后,會自動的根據JSESSIONID的值,找到對應的會話對象Session。

那經過這兩步測試,大家也會看到,在控制臺中輸出如下日志:
在這里插入圖片描述

兩次請求,獲取到的Session會話對象的hashcode是一樣的,就說明是同一個會話對象。而且,第一次請求時,往Session會話對象中存儲的值,第二次請求時,也獲取到了。 那這樣,我們就可以通過Session會話對象,在同一個會話的多次請求之間來進行數據共享了。

優缺點

  • 優點:Session是存儲在服務端的,安全
  • 缺點:
    • 服務器集群環境下無法直接使用Session
    • 移動端APP(Android、IOS)中無法使用Cookie
    • 用戶可以自己禁用Cookie
    • Cookie不能跨域

PS:Session 底層是基于Cookie實現的會話跟蹤,如果Cookie不可用,則該方案,也就失效了。

服務器集群環境為何無法使用Session?
在這里插入圖片描述
首先第一點,我們現在所開發的項目,一般都不會只部署在一臺服務器上,因為一臺服務器會存在一個很大的問題,就是單點故障。所謂單點故障,指的就是一旦這臺服務器掛了,整個應用都沒法訪問了。
![在這里插入圖片描述](https://img-blog.csdnimg.cn/direct/ffd4ee2143a1477aaf51202a3712d06d.png#pic_center

  • 所以在現在的企業項目開發當中,最終部署的時候都是以集群的形式來進行部署,也就是同一個項目它會部署多份。
  • 而用戶在訪問的時候,他會訪問一臺前置的服務器,我們叫負載均衡服務器,它的作用就是將前端發起的請求均勻的分發給后面的這三臺服務器。
    在這里插入圖片描述此時假如我們通過 session 來進行會話跟蹤,可能就會存在這樣一個問題。
  • 用戶打開瀏覽器要進行登錄操作,此時會發起登錄請求。登錄請求到達負載均衡服務器,將這個請求轉給了第一臺 Tomcat 服務器。
  • 服務器接收到請求后,獲取到會話對象session,然后給瀏覽器響應數據和攜帶一個cookie。
  • 此時,我們再執行一次操作,這次請求到達負載均衡服務器之后,負載均衡服務器將這次請求轉給了第二臺 Tomcat 服務器,此時他就要到第二臺 Tomcat 服務器當中根據JSESSIONID 也就是對應的 session 的 ID 值,要找對應的 session 會話對象。
  • 顯然,第二臺服務器當中并沒有這個ID的會話對象 Session。
    同一個瀏覽器發起了 2 次請求,結果獲取到的不是同一個會話對象,這就是Session這種會話跟蹤方案它的缺點,在服務器集群環境下無法直接使用Session。

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

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

相關文章

go語言怎么獲取文件的大小并且轉化為kb為單位呢?

在Go語言中,你可以使用os包中的IsExist和Stat函數來獲取文件的信息,包括文件的大小。文件的大小通常是以字節為單位的,但你可以很容易地將其轉換為KB(千字節)。 下面是一個簡單的Go程序示例,該程序打開指定…

Simulink 模型生成 C 代碼(一):使用 Embedded Coder 快速向導生成代碼

以matlab自帶的示例模型RollAxisAutopilot為例進行講解。RollAxisAutopilot為飛機自動駕駛控制系統模型。 使用快速向導工具生成代碼 通過鍵入以下命令打開模型 RollAxisAutopilot: openExample(RollAxisAutopilot); 如果 C 代碼選項卡尚未打開,請在 …

【C++】宏定義

嚴格來說,這個題目起名為C是不合適的,因為宏定義是C語言的遺留特性。CleanCode并不推薦C中使用宏定義。我當時還在公司做過宏定義為什么應該被取代的報告。但是適當使用宏定義對代碼是有好處的。壞處也有一些。 無參宏定義 最常見的一種宏定義&#xf…

makefile總結

1,Makefile規則介紹 一個簡單的 Makefile 描述規則組成: TARGET... : PREREQUISITES... COMMAND 注意: 每一個命令行必須以[Tab]字符開始, [Tab]字符告訴 make 此行是一個命令行。 make 按照命令完成相應的動作。這也是書寫 Makefile 中容易產生,而且比較隱蔽的錯…

油煙凈化器:餐飲業健康環保的守護者

我最近分析了餐飲市場的油煙凈化器等產品報告,解決了餐飲業廚房油膩的難題,更加方便了在餐飲業和商業場所有需求的小伙伴們。 在現代餐飲業,油煙凈化器已經成為不可或缺的重要設備。它不僅是保障餐飲環境清潔的利器,更是守護健康…

新聲創新20年:無線技術給助聽器插上“娛樂”的翅膀

聽力損失并非現代人的專利,古代人也會有聽力損失。助聽器距今發展已經有二百多年了,從當初單純的聲音放大器到如今的全數字時代助聽器,助聽器發生了翻天覆地的變化,現代助聽器除了助聽功能,還具有看電視,聽…

【LeetCode】368. 最大整除子集

雖然這題挺難寫的,但是仍然提醒了我:解題要注意方法。在明確分析當一條道路走不通的時候,就不要再猶豫了,就要果斷的換方法,嘗試用其它方法解決。否則一味的消耗時間,得不償失。換方法的前提是明確的分析&a…

C++ 和C#的差別

首先把眼睛瞪大,然后憋住一口氣,讀下去: 1、CPP 就是C plus plus的縮寫,中國大陸的程序員圈子中通常被讀做"C加加",而西方的程序員通常讀做"C plus plus",它是一種使用非常廣泛的計算…

Maya崩潰閃退常見原因及解決方案

Autodesk Maya 是一款功能強大的 3D 計算機圖形程序,被電影、游戲和建筑等各個領域的設計師廣泛使用。然而,Maya 就像任何其他軟件一樣可能會發生崩潰問題。在前文中,小編給大家介紹了3ds Max使用V-Ray渲染時的崩潰閃退解決方案: …

Neo4j 圖數據庫 高級操作

Neo4j 圖數據庫 高級操作 文章目錄 Neo4j 圖數據庫 高級操作1 批量添加節點、關系1.1 直接使用 UNWIND 批量創建關系1.2 使用 CSV 文件批量創建關系1.3 選擇方法 2 索引2.1 創建單一屬性索引2.2 創建組合屬性索引2.3 創建全文索引2.4 列出所有索引2.5 刪除索引2.6 注意事項 3 清…

后端之路第三站(Mybatis)——JDBC跟Mybatis、lombok

一、什么是JDBC JDBC就是sun公司研發的一套通過java來操控數據庫的工具,對應不同的數據庫系統有不同的JDBC,而他們統稱【驅動】,這就是上一篇我們提到創建Mybatis項目時要引入的依賴、以及連接數據庫四要素里的第一要素。 JDBC有自己一套原始…

SerialportToTCP② 全

效果補全(代碼): namespace SerialportToTCP {public partial class Form1 : Form{IniHelper Ini;string[] botelvs new string[] { "1200", "4800", "9600", "13200" };public Form1(){Initializ…

Elasticsearch:Painless scripting 語言(一)

Painless 是一種高性能、安全的腳本語言,專為 Elasticsearch 設計。你可以使用 Painless 在 Elasticsearch 支持腳本的任何地方安全地編寫內聯和存儲腳本。 Painless 提供眾多功能,這些功能圍繞以下核心原則: 安全性:確保集群的…

安卓gdb 建立鏈接

adbshell gdbserver :1234 testdcam --sensor 0 --workmode 0 --args preview-size1024x600,picture-size640x480, --time 10 adb forwardtcp:1234 tcp:1234 //設置adb的轉發 ./prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/arm-linux-androideabi-gdb out/tar…

近紅外光譜腦功能成像(fNIRS):1.光學原理、變量選取與預處理

一、朗伯-比爾定律與修正的朗伯-比爾定律 朗伯-比爾定律 是一個描述光通過溶液時被吸收的規律。想象你有一杯有色液體,比如一杯紅茶。當你用一束光照射這杯液體時,光的一部分會被液體吸收,導致透過液體的光變弱。朗伯-比爾定律告訴我們&#…

mmdetection3D指定版本安裝指南

1. 下載指定版本號 選擇指定版本號下載mmdetection3d的源碼,如這里選擇的是0.17.2版本 git clone https://github.com/open-mmlab/mmdetection3d.git -b v0.17.22. 安裝 cd mmdetection3d安裝依賴庫 pip install -r requirment.txt編譯安裝 pip install -v e .…

redis主從復制哨兵模式集群管理

主從復制: 主從復制是高可用Redis的基礎,哨兵和集群都是在主從復制基礎上實現高可用的。主從復制主要實現了數據的多機備份,以及對于讀操作的負載均衡和簡單的故障恢復。缺陷:故障恢復無法自動化;寫操作無法負載均衡&…

軟件測試與質量保證 | 云班課簡答題庫

目錄 第14章 質量相關簡答題 第15章 測試實際相關簡答題 第16章 測試基本相關簡答題 第14章 質量相關簡答題 1. 簡述基本的測量原則。 測量應該基于該應用領域正確的理論之上,并在測量的定義中確定測度的目標;每一個技術測量的定義應該具有一致性和客…

HbuilderX:安卓打包證書.keystore生成與使用

前置條件 已安裝jdk或配置好jre環境。 .keystore生成 打開cmd,切換到目標路徑,輸入以下命令, keytool -genkey -alias testalias -keyalg RSA -keysize 2048 -validity 36500 -keystore test.keystore 輸入密鑰庫口令(要記住), 然后輸入一系列信息, …

ui.perfetto.dev sql 查詢某個事件范圍內,某個事件的耗時并降序排列

ui.perfetto.dev sql 查詢某個事件范圍內,某個事件的耗時并降序排列 1.打開https://ui.perfetto.dev 導入Chrome Trace Json文件2.ParallelMLP.forward下的RowParallelLinear.forward3.點擊Query(SQL),在輸入框中輸入以下內容,按CtrlEnter,顯示查詢結果4.點擊Show timeline,點擊…