本篇開始寫「單點登陸與權限管理」系列的第一部分:單點登陸與權限管理本質,這部分主要介紹相關的知識概念、抽象的處理過程、常見的實現框架。經過這部分的介紹,可以對單點登陸與權限管理有總體上的瞭解,對其相關概念、處理流程、常見實現有個基本的認識。html
本篇文章介紹下session和cookie,它是登陸實現的基礎,主要從下面幾個方面介紹:java
cookie的跨域問題會在後續文章單獨介紹。數據庫
大部分系統都須要識別用戶的身份,有些功能只有特定的用戶能使用,有些功能須要根據用戶身份顯示不一樣的內容,通常使用惟一編號標識用戶的身份。後端
就像咱們的身份證,身份證號是每一個人惟一的,根據所在的省市區、出生年月、性別等規則生成,咱們去政府機構辦事時,都須要帶着身份證,他們經過身份證驗證咱們的身份。跨域
session和cookie主要用來識別登陸者身份的,默認經過JSESSIONID惟一編號進行驗證。session是在服務端保存的一個數據結構,用來跟蹤用戶的狀態,也能夠保存用戶相關的一些數據,能夠保存在內存、緩存、數據庫等存儲結構中。cookie是客戶端保存用戶信息的一種機制。瀏覽器
javax.servlet.http包中是session的主要API接口,主要有如下幾種接口:緩存
session相關的接口,通常由應用服務器來實現,好比Tomcat、Resin、Jetty。Session的主要特徵:tomcat
在tomcat中,HttpSession的實現是StandardSession,同時StandardSession會實現自定義的Session接口,它是對HttpSesion一個包裝。安全
另外,tomcat會實現session的管理和持久化,可隨時獲取到對應的session,具體實現不在本篇分析,網上有不少文章介紹。服務器
cookie是客戶端的解決方案,是服務器發給客戶端的特殊信息,這些信息以文本文件的方式存放在客戶端,後續請求,客戶端都會帶上這些特殊的信息。
服務端經過HTTPResponse設置cookie到響應頭,發送到客戶端,後續客戶端自動將cookie信息設置到請求頭。下面是我登陸百度後的cookie信息:
cookie也有失效時間,可在服務端經過cookie.setMaxAge(expiry)進行設置,expiry=-1:表明瀏覽器關閉後,cookie就失效了;expiry>0:表明會將cookie保存到硬盤中,直到設置時間過時纔會被瀏覽器自動刪除;expiry=0:刪除cookie,cookie都會被瀏覽器給刪除。
另外還有其餘幾個特性:
當瀏覽器禁用cookie後,基於cookie的session將不能正常工做,每次都將建立一個新的session,可經過url重寫傳遞jsessionid。
session存儲在服務器端,session在用戶第一次訪問時建立,訪問jsp、servlet等程序時纔會建立Session,只訪問html、image等靜態資源並不會建立,可調用request.getSession(true)強制生成Session。
服務器會把長時間沒有活動的Session從內存中清除,tomcat中session的默認失效時間爲20分鐘,可調用調用session的invalidate方法強制清楚。
另外,咱們能夠本身實現session生命週期的管理,以知足特定的業務需求,好比後續要講的單點登陸、分佈式session等,tomcat可提供了相應擴展,後續文章會介紹。
建立cookie時,須要設置domain,有多級域名時,能夠控制cookie的做用域。若是網站請求量很大,設置的cookie做用域不當,會浪費不少流量。
下面舉例說明,好比有三級域名support.kefu.mi.com,其中,mi.com是一級域名,kefu.mi.com是二級域名。
在3類域名下進行cookie設置,分別設置不一樣的domain,看看訪問各級域名時cookie的有效性。當domain設置爲空時,domain默認爲當前域名。
domain參數 | 訪問一級 | 訪問二級 | 訪問三級 |
---|---|---|---|
空 | √ | √ | √ |
mi.com | √ | √ | √ |
kefu.mi.com | × | × | × |
mcc.kefu.mi.com | × | × | × |
當domain爲一級域名時,一級域名、包括其下的子域名均可以接收到cookie。可是domain參數設置其子域名時,全部域名就接收不到了,包括那個子域名。
domain參數 | 訪問一級 | 訪問二級 | 訪問三級 |
---|---|---|---|
空 | × | √ | √ |
mi.com | √ | √ | √ |
kefu.mi.com | × | √ | √ |
mcc.kefu.mi.com | × | × | × |
當domain爲自身域名時,其父域名沒法接收到cookie,其自己與其子域名能夠接收到cookie。而設置其子域名或其餘域名時,全部域名都接收不到cookie。
domain參數 | 訪問一級 | 訪問二級 | 訪問三級 |
---|---|---|---|
空 | × | × | √ |
mi.com | √ | √ | √ |
kefu.mi.com | × | √ | √ |
mcc.kefu.mi.com | × | × | √ |
能夠得出結論:domain參數能夠設置父域名以及自身,但不能設置其它域名,包括子域名,不然cookie不起做用。