1. 程式人生 > >shiro原始碼分析篇1:前言

shiro原始碼分析篇1:前言

目的:通過這幾篇shiro原始碼分析,用redis代替ehache做session快取。

相信大家對shiro也不陌生了,網上對shiro原始碼分析的也比較多了。筆者也看多很多優秀的部落格。這幾篇shiro原始碼分析的目的,就是弄明白,shiro是如何管理session的,如何通過redis來解決session跨域問題。一步步分析最終達到這個目的。

前言:Session和cookies

筆者想通過幾個問題來解決我心中的疑惑。

1.Session建立的時間

我們第一次開啟瀏覽器,訪問某網站發起請求時,比如請求百度的首頁,會返回一個Session。真正返回是執行 HttpSession session = HttpServletRequest.getSession(true)這句話時產生的。我們知道第一次訪問某個網站就會產生一個session返回給客戶端。

2.第一次Session獲取後,以後瀏覽器請求是否都是同一個Session發起請求

第一次伺服器返回給瀏覽器會產生一個session,當然可以設定過期時間,過期後重新生成session。但是session沒有過期,瀏覽器每次請求會在請求頭部上:Cookie:JSESSIONID=客戶端第一次拿到的session ID。
這樣就在使用者登入後,以後伺服器只要檢測session就知道使用者有沒有登入,如果不是同一個session那麼豈不每次都要登入。

但是是否每次請求都是同一個Session下。筆者認為同一瀏覽器是一致的。如果你要同個瀏覽器多個視窗,或者不同瀏覽器等等,可能會不一致。

3.Session如何刪除

1.清除瀏覽器快取。哈哈你好多網站都需要重新登入了。
2.Session超時刪除。
3.伺服器關閉。

4.Session儲存在哪裡

session存在伺服器記憶體中,我們可以將它持久化,例如redi快取下來。

我們看看第一次請求請求是沒有帶上session的。
這裡寫圖片描述
第二次請求帶上session,是第一次伺服器返回的。

session和cookies的區別:

相信這個大家百度就有很多答案了。

shiro是如何管理session?

思考這樣一個問題,如果讓你做一個登入功能,如何管理使用者登入狀態?

1.使用者第一次登入時,登入成功後,將session快取起來,比如ehcache或者redis,設定快取的過期時間。

2.使用者點選被攔截的其他連結時。首先會獲取請求中session,注意前面講過同一瀏覽器會是同一個session。獲得請求的session從快取中去查詢,如果存在並且快取過期時間沒有過,那麼更新快取時間。如果沒有找到或者session已經過期,那麼攔截成功跳到登入頁面。

shiro同樣是這樣。當然shiro遠比這複雜多了。

接下來我的分析思路是:

1.shiro如何攔截請求,如何通過session找不到快取,跳到登入頁面。
2.使用者登入成功後,如何將session快取下來。
3.如何用redis來做單點登入。

大概後續有三篇部落格。


菜鳥不易,忘有問題指出,共同進步。