單點(diǎn)登錄與權(quán)限管理本質(zhì):session和cookie介紹

本篇開始寫「單點(diǎn)登錄與權(quán)限管理」系列的第一部分:?jiǎn)吸c(diǎn)登錄與權(quán)限管理本質(zhì),這部分主要介紹相關(guān)的知識(shí)概念、抽象的處理過程、常見的實(shí)現(xiàn)框架。通過這部分的介紹,能夠?qū)吸c(diǎn)登錄與權(quán)限管理有整體上的了解,對(duì)其相關(guān)概念、處理流程、常見實(shí)現(xiàn)有個(gè)基本的認(rèn)識(shí)。

本篇文章介紹下session和cookie,它是登錄實(shí)現(xiàn)的基礎(chǔ),主要從下面幾個(gè)方面介紹:

  • session和cookie基本概念
  • session的生命周期
  • cookie的作用域

cookie的跨域問題會(huì)在后續(xù)文章單獨(dú)介紹。

基本概念

大部分系統(tǒng)都需要識(shí)別用戶的身份,有些功能只有特定的用戶能使用,有些功能需要根據(jù)用戶身份顯示不同的內(nèi)容,一般使用唯一編號(hào)標(biāo)識(shí)用戶的身份。

就像我們的身份證,身份證號(hào)是每個(gè)人唯一的,根據(jù)所在的省市區(qū)、出生年月、性別等規(guī)則生成,我們?nèi)フ畽C(jī)構(gòu)辦事時(shí),都需要帶著身份證,他們通過身份證驗(yàn)證我們的身份。

session和cookie主要用來識(shí)別登錄者身份的,默認(rèn)通過JSESSIONID唯一編號(hào)進(jìn)行驗(yàn)證。session是在服務(wù)端保存的一個(gè)數(shù)據(jù)結(jié)構(gòu),用來跟蹤用戶的狀態(tài),也可以保存用戶相關(guān)的一些數(shù)據(jù),可以保存在內(nèi)存、緩存、數(shù)據(jù)庫(kù)等存儲(chǔ)結(jié)構(gòu)中。cookie是客戶端保存用戶信息的一種機(jī)制。

servlet session

javax.servlet.http包中是session的主要API接口,主要有以下幾種接口:

  • HttpSession:實(shí)際的session接口定義;
  • Listener:session發(fā)生一些動(dòng)作,如創(chuàng)建,設(shè)置屬性,失效等,會(huì)觸發(fā)一些事件,進(jìn)行相應(yīng)的處理;
  • Event:當(dāng)動(dòng)作觸發(fā)之后,封裝為對(duì)應(yīng)的事件;
Session相關(guān)接口

session相關(guān)的接口,一般由應(yīng)用服務(wù)器來實(shí)現(xiàn),比如Tomcat、Resin、Jetty。Session的主要特征:

  • 可以設(shè)置和獲取一些屬性;
  • 每個(gè)session對(duì)應(yīng)一個(gè)編號(hào)sessionId,是一次會(huì)話的唯一表示;
  • session有超時(shí)時(shí)間,用戶長(zhǎng)時(shí)間無操作,維護(hù)的定時(shí)器會(huì)清除session,保證資源及時(shí)釋放;
  • 可以通過調(diào)用invalidate方法主動(dòng)清除session;

在tomcat中,HttpSession的實(shí)現(xiàn)是StandardSession,同時(shí)StandardSession會(huì)實(shí)現(xiàn)自定義的Session接口,它是對(duì)HttpSesion一個(gè)包裝。


Tomcat Sesion接口

另外,tomcat會(huì)實(shí)現(xiàn)session的管理和持久化,可隨時(shí)獲取到對(duì)應(yīng)的session,具體實(shí)現(xiàn)不在本篇分析,網(wǎng)上有很多文章介紹。

cookie

cookie是客戶端的解決方案,是服務(wù)器發(fā)給客戶端的特殊信息,這些信息以文本文件的方式存放在客戶端,后續(xù)請(qǐng)求,客戶端都會(huì)帶上這些特殊的信息。

服務(wù)端通過HTTPResponse設(shè)置cookie到響應(yīng)頭,發(fā)送到客戶端,后續(xù)客戶端自動(dòng)將cookie信息設(shè)置到請(qǐng)求頭。下面是我登錄百度后的cookie信息:


百度cookie信息

cookie也有失效時(shí)間,可在服務(wù)端通過cookie.setMaxAge(expiry)進(jìn)行設(shè)置,expiry=-1:代表瀏覽器關(guān)閉后,cookie就失效了;expiry>0:代表會(huì)將cookie保存到硬盤中,直到設(shè)置時(shí)間過期才會(huì)被瀏覽器自動(dòng)刪除;expiry=0:刪除cookie,cookie都會(huì)被瀏覽器給刪除。

另外還有其他幾個(gè)特性:

  • setDomain:設(shè)置cookie范圍,后面會(huì)詳細(xì)介紹;
  • isHttpOnly:是否只是http協(xié)議使用。只能在后端通過getCookies()獲取,js不能獲??;
  • 每一個(gè)cookie文件大小:4kb , 如果超過4kb瀏覽器不識(shí)別;
  • cookie不安全,可能泄露用戶信息,瀏覽器支持禁用cookie操作;
  • 臨時(shí)session:默認(rèn)生命周期,當(dāng)瀏覽器關(guān)閉時(shí)cookie銷毀的;
交互過程
交互過程圖
  1. 使用瀏覽器訪問服務(wù)端頁(yè)面;
  2. 服務(wù)端收到該客戶端第一次請(qǐng)求后,會(huì)創(chuàng)建一個(gè)session,生產(chǎn)一個(gè)唯一sessionId;
  3. 同時(shí)在響應(yīng)請(qǐng)求中設(shè)置cookie,屬性名為jessionid;
  4. 客戶端收到后會(huì)保存jessionid,再次請(qǐng)求時(shí),會(huì)在header中設(shè)置,服務(wù)端可從請(qǐng)求頭中獲??;
  5. 服務(wù)端驗(yàn)證獲取的sessionId是否存在,即可驗(yàn)證是否是同一用戶;

當(dāng)瀏覽器禁用cookie后,基于cookie的session將不能正常工作,每次都將創(chuàng)建一個(gè)新的session,可通過url重寫傳遞jsessionid。

session的生命周期

session存儲(chǔ)在服務(wù)器端,session在用戶第一次訪問時(shí)創(chuàng)建,訪問jsp、servlet等程序時(shí)才會(huì)創(chuàng)建Session,只訪問html、image等靜態(tài)資源并不會(huì)創(chuàng)建,可調(diào)用request.getSession(true)強(qiáng)制生成Session。

服務(wù)器會(huì)把長(zhǎng)時(shí)間沒有活動(dòng)的Session從內(nèi)存中清除,tomcat中session的默認(rèn)失效時(shí)間為30分鐘,可調(diào)用調(diào)用session的invalidate方法強(qiáng)制清楚。

另外,我們可以自己實(shí)現(xiàn)session生命周期的管理,以滿足特定的業(yè)務(wù)需求,比如后續(xù)要講的單點(diǎn)登錄、分布式session等,tomcat可提供了相應(yīng)擴(kuò)展,后續(xù)文章會(huì)介紹。

cookie的作用域

創(chuàng)建cookie時(shí),需要設(shè)置domain,有多級(jí)域名時(shí),可以控制cookie的作用域。如果網(wǎng)站請(qǐng)求量很大,設(shè)置的cookie作用域不當(dāng),會(huì)浪費(fèi)很多流量。

下面舉例說明,比如有三級(jí)域名support.kefu.mi.com,其中,mi.com是一級(jí)域名,kefu.mi.com是二級(jí)域名。

在3類域名下進(jìn)行cookie設(shè)置,分別設(shè)置不同的domain,看看訪問各級(jí)域名時(shí)cookie的有效性。當(dāng)domain設(shè)置為空時(shí),domain默認(rèn)為當(dāng)前域名。

在一級(jí)域名mi.com下設(shè)置cookie
domain參數(shù) 訪問一級(jí) 訪問二級(jí) 訪問三級(jí)
mi.com
kefu.mi.com × × ×
mcc.kefu.mi.com × × ×

當(dāng)domain為一級(jí)域名時(shí),一級(jí)域名、包括其下的子域名都可以接收到cookie。但是domain參數(shù)設(shè)置其子域名時(shí),所有域名就接收不到了,包括那個(gè)子域名。

在二級(jí)域名kefu.mi.com下設(shè)置cookie
domain參數(shù) 訪問一級(jí) 訪問二級(jí) 訪問三級(jí)
×
mi.com
kefu.mi.com ×
mcc.kefu.mi.com × × ×

當(dāng)domain為自身域名時(shí),其父域名無法接收到cookie,其本身與其子域名可以接收到cookie。而設(shè)置其子域名或其他域名時(shí),所有域名都接收不到cookie。

在三級(jí)域名mcc.kefu.mi.com下設(shè)置cookie
domain參數(shù) 訪問一級(jí) 訪問二級(jí) 訪問三級(jí)
× ×
mi.com
kefu.mi.com ×
mcc.kefu.mi.com × ×

可以得出結(jié)論:domain參數(shù)可以設(shè)置父域名以及自身,但不能設(shè)置其它域名,包括子域名,否則cookie不起作用。

情情說
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 背景在HTTP協(xié)議的定義中,采用了一種機(jī)制來記錄客戶端和服務(wù)器端交互的信息,這種機(jī)制被稱為cookie,cooki...
    時(shí)芥藍(lán)閱讀 2,455評(píng)論 1 17
  • HTTP cookie(也稱為web cookie,網(wǎng)絡(luò)cookie,瀏覽器cookie或者簡(jiǎn)稱cookie)是網(wǎng)...
    留七七閱讀 18,376評(píng)論 2 71
  • 我總是試著改變那些偏離軌道的事情,但是好像最后我想改變,我為人家爭(zhēng)取的事情,到最后還是無法挽回。 事情過去了好多年...
    玫瑰是我偷的閱讀 393評(píng)論 0 0
  • 傳送門 https://pintia.cn/problem-sets/994805260223102976/pro...
    Rush的博客閱讀 1,581評(píng)論 0 0
  • 相聚甚歡,一拍兩散 以為劇情發(fā)展會(huì)跟說好的一樣:最后聚一下,我們就這樣結(jié)束。 要了VIP的包間,隱私性更好,不至于...
    華燈初上mg閱讀 252評(píng)論 0 0

友情鏈接更多精彩內(nèi)容