導航:首頁 > 編程語言 > javacookie作用域

javacookie作用域

發布時間:2024-12-16 14:15:08

java什麼是會話技術

關於java中的會話技術需要理解以下幾點:

常用的會話技術有:Cookies、Session和Url重寫。

Cookies:由容器創建並且保存在客戶端,客戶端後續訪問伺服器的請求都將返回該Cookie ,明確地請求與會話關聯,又Cookies攜帶SessionId到伺服器端。

Session:Session本質上是伺服器端的一塊內存,可以往裡面放內容。並賦SessionId, 與Cookies攜帶的SessionId對應。

Url重寫:如果瀏覽器不支持cookies,需要自己編程使用URL重寫的方式實現(這樣session永遠有效),方式如下:

response.encodeURL();

② java web應用如何實現單點登錄

在 B/S 系統中,登錄功能通常都是基於 Cookie 來實現的。當用戶登錄成功後,一般會將登錄狀態記錄到 Session 中,或者是給用戶簽發一個 Token,無論哪一種方式,都需要在客戶端保存一些信息(Session ID 或 Token ),並要求客戶端在之後的每次請求中攜帶它們。在這樣的場景下,使用 Cookie 無疑是最方便的,因此我們一般都會將 Session 的 ID 或 Token 保存到 Cookie 中,當服務端收到請求後,通過驗證 Cookie 中的信息來判斷用戶是否登錄 。


單點登錄(Single Sign On, SSO)是指在同一帳號平台下的多個應用系統中,用戶只需登錄一次,即可訪問所有相互信任的應用系統。舉例來說,網路貼吧和網路地圖是網路公司旗下的兩個不同的應用系統,如果用戶在網路貼吧登錄過之後,當他訪問網路地圖時無需再次登錄,那麼就說明網路貼吧和網路地圖之間實現了單點登錄。


單點登錄的本質就是在多個應用系統中共享登錄狀態。如果用戶的登錄狀態是記錄在 Session 中的,要實現共享登錄狀態,就要先共享 Session,比如可以將 Session 序列化到 Redis 中,讓多個應用系統共享同一個 Redis,直接讀取 Redis 來獲取 Session。


當然僅此是不夠的,因為不同的應用系統有著不同的域名,盡管 Session 共享了,但是由於 Session ID 是往往保存在瀏覽器 Cookie 中的,因此存在作用域的限制,無法跨域名傳遞,也就是說當用戶在 app1.com 中登錄後,Session ID 僅在瀏覽器訪問 app1.com 時才會自動在請求頭中攜帶,而當瀏覽器訪問 app2.com 時,Session ID 是不會被帶過去的。實現單點登錄的關鍵在於,如何讓 Session ID(或 Token)在多個域中共享。


實現方式一:父域 Cookie

在將具體實現之前,我們先來聊一聊 Cookie 的作用域。


Cookie 的作用域由 domain 屬性和 path 屬性共同決定。domain 屬性的有效值為當前域或其父域的域名/IP地址,在 Tomcat 中,domain 屬性默認為當前域的域名/IP地址。path 屬性的有效值是以「/」開頭的路徑,在 Tomcat 中,path 屬性默認為當前 Web 應用的上下文路徑。


如果將 Cookie 的 domain 屬性設置為當前域的父域,那麼就認為它是父域 Cookie。Cookie 有一個特點,即父域中的 Cookie 被子域所共享,換言之,子域會自動繼承父域中的Cookie。


利用 Cookie 的這個特點,不難想到,將 Session ID(或 Token)保存到父域中不就行了。沒錯,我們只需要將 Cookie 的 domain 屬性設置為父域的域名(主域名),同時將 Cookie 的 path 屬性設置為根路徑,這樣所有的子域應用就都可以訪問到這個 Cookie 了。不過這要求應用系統的域名需建立在一個共同的主域名之下,如 tieba..com 和 map..com,它們都建立在 .com 這個主域名之下,那麼它們就可以通過這種方式來實現單點登錄。


總結:此種實現方式比較簡單,但不支持跨主域名。


實現方式二:認證中心

我們可以部署一個認證中心,認證中心就是一個專門負責處理登錄請求的獨立的 Web 服務。


用戶統一在認證中心進行登錄,登錄成功後,認證中心記錄用戶的登錄狀態,並將 Token 寫入 Cookie。(注意這個 Cookie 是認證中心的,應用系統是訪問不到的。)


應用系統檢查當前請求有沒有 Token,如果沒有,說明用戶在當前系統中尚未登錄,那麼就將頁面跳轉至認證中心。由於這個操作會將認證中心的 Cookie 自動帶過去,因此,認證中心能夠根據 Cookie 知道用戶是否已經登錄過了。如果認證中心發現用戶尚未登錄,則返回登錄頁面,等待用戶登錄,如果發現用戶已經登錄過了,就不會讓用戶再次登錄了,而是會跳轉回目標 URL ,並在跳轉前生成一個 Token,拼接在目標 URL 的後面,回傳給目標應用系統。


應用系統拿到 Token 之後,還需要向認證中心確認下 Token 的合法性,防止用戶偽造。確認無誤後,應用系統記錄用戶的登錄狀態,並將 Token 寫入 Cookie,然後給本次訪問放行。(注意這個 Cookie 是當前應用系統的,其他應用系統是訪問不到的。)當用戶再次訪問當前應用系統時,就會自動帶上這個 Token,應用系統驗證 Token 發現用戶已登錄,於是就不會有認證中心什麼事了。


這里順便介紹兩款認證中心的開源實現:


Apereo CAS 是一個企業級單點登錄系統,其中 CAS 的意思是」Central Authentication Service「。它最初是耶魯大學實驗室的項目,後來轉讓給了 JASIG 組織,項目更名為 JASIG CAS,後來該組織並入了Apereo 基金會,項目也隨之更名為 Apereo CAS。


XXL-SSO 是一個簡易的單點登錄系統,由大眾點評工程師許雪裡個人開發,代碼比較簡單,沒有做安全控制,因而不推薦直接應用在項目中,這里列出來僅供參考。


總結:此種實現方式相對復雜,支持跨域,擴展性好,是單點登錄的標准做法。


實現方式三:LocalStorage 跨域

前面,我們說實現單點登錄的關鍵在於,如何讓 Session ID(或 Token)在多個域中共享。


父域 Cookie 確實是一種不錯的解決方案,但是不支持跨域。那麼有沒有什麼奇淫技巧能夠讓 Cookie 跨域傳遞呢?


很遺憾,瀏覽器對 Cookie 的跨域限制越來越嚴格。Chrome 瀏覽器還給 Cookie 新增了一個 SameSite 屬性,此舉幾乎禁止了一切跨域請求的 Cookie 傳遞(超鏈接除外),並且只有當使用 HTTPs 協議時,才有可能被允許在 AJAX 跨域請求中接受伺服器傳來的 Cookie。


不過,在前後端分離的情況下,完全可以不使用 Cookie,我們可以選擇將 Session ID (或 Token )保存到瀏覽器的 LocalStorage 中,讓前端在每次向後端發送請求時,主動將 LocalStorage 的數據傳遞給服務端。這些都是由前端來控制的,後端需要做的僅僅是在用戶登錄成功後,將 Session ID (或 Token )放在響應體中傳遞給前端。


在這樣的場景下,單點登錄完全可以在前端實現。前端拿到 Session ID (或 Token )後,除了將它寫入自己的 LocalStorage 中之外,還可以通過特殊手段將它寫入多個其他域下的 LocalStorage 中。

————————————————

版權聲明:本文為CSDN博主「風水道人」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。

原文鏈接:https://blog.csdn.net/jcmj123456/article/details/114296482

前端通過 iframe+postMessage() 方式,將同一份 Token 寫入到了多個域下的 LocalStorage 中,前端每次在向後端發送請求之前,都會主動從 LocalStorage 中讀取 Token 並在請求中攜帶,這樣就實現了同一份 Token 被多個域所共享。


總結:此種實現方式完全由前端控制,幾乎不需要後端參與,同樣支持跨域。


補充:域名分級

從專業的角度來說(根據《計算機網路》中的定義),.com、.cn 為一級域名(也稱頂級域名),.com.cn、.com 為二級域名,sina.com.cn、tieba..com 為三級域名,以此類推,N 級域名就是 N-1 級域名的直接子域名。


從使用者的角度來說,一般把可支持獨立備案的主域名稱作一級域名,如 .com、sina.com.cn 皆可稱作一級域名,在主域名下建立的直接子域名稱作二級域名,如 tieba..com 為二級域名。

jsp中頁面間對象傳遞的方法有哪幾種

  1. 傳遞方法有:page,request,session,application,其中cookie是保存在客戶端的,是用來解決HTTP無狀態問題。

  2. Cookie對象變數,cookie是保存在客戶端的,是用來解決HTTP無狀態問題。

  3. Cookie對象變數和session一樣,他們不同的是,session是存在伺服器端,而cookie是存放在客戶端的。

  4. Application對象的作用范圍是整個全局,他對所有用戶都有效,session和cookie是對一個用戶而言,所以我們可以用它統計登陸該網站的人數。Application變數不會自己消亡,會始終占據內存,創建過多的變數會降低響應速度,只有在服務被中止、Global.asa被改變或者該Application被卸載下才會被終止。

  5. QuerySting在頁面間傳遞值。這種方法的寫法:在要傳遞值的頁面,Response.Redirect(url),值包含在在url中。接收值得頁面,Request.QueryString["變數名"]。

④ 在java中,JSP重定向,轉發,Cookie,session

既然不需要解釋重定向和轉發的概念 上面的逐條注釋就解釋的很清楚了 要別人專解釋也是大同小異
首先屬對於重定向,轉發 要了解他們的工作流程 然後對於Cookie,session的值
Cookie保存於客戶端 session保存於伺服器 還有一些概念自己查
重定向是客戶端跳轉,共有二次請求 轉發是伺服器端跳轉 只有最開始打開頁面的一次請求
對照上面的概念 自己看看就明白了
第一個是對的 我就不說了
第二個 要記住對Cookie的賦值只有等下一次瀏覽請求時才能生效。
第三個 第四個 沒寫入Cookie
第五個 第六個 第七個 第八個 了解session作用范圍 基本上寫入session的東西 只要不是編譯報錯 都能取得到 一般很少會把值保存 session裡面
還說個request 作用域更小了 保存值+然後重定向=獲取不到 以後request 用的多

閱讀全文

與javacookie作用域相關的資料

熱點內容
什麼app可以掃碼查價格呢 瀏覽:574
多少王文件算一卷 瀏覽:423
手機復製版在哪個文件夾 瀏覽:724
u盤大小不夠傳大文件卡了 瀏覽:531
如何清空linux文件夾 瀏覽:215
資料庫表鎖定軟體 瀏覽:163
爐石新版本最便宜卡組 瀏覽:169
javacookie作用域 瀏覽:857
開社交網站需要什麼語言 瀏覽:573
v開頭的視頻網站是哪個 瀏覽:327
涉及到師德師風建設的文件有哪些 瀏覽:60
軟媒魔方的硬碟安裝win10 瀏覽:359
安卓模擬器xp系統 瀏覽:550
網路市場與傳統市場的差異是什麼 瀏覽:387
蘋果怎麼打開移動數據 瀏覽:46
php怎麼連接sql資料庫 瀏覽:122
lol提示網路連接異常 瀏覽:40
photoshop復制選區到其他文件 瀏覽:734
魔獸三冰封王座安卓版 瀏覽:343
lr導出文件大小限制為多少k合適 瀏覽:529

友情鏈接