專案中瑣碎知識(三)
阿新 • • 發佈:2018-11-14
(一)ThreadLocal
動態的獲取資訊
1 需求分析
如果將使用者資訊儲存到?Session域中,那麼需要在Controller方法中必須新增request物件.
但是想在任何地方獲取使用者資訊應該怎麼辦??
解決方案: ThreadLocal
2 功能原理
ThreadLocal(本地執行緒變數)在一個執行緒內,實現資料的共享,執行緒是安全的.
但是使用它的時候一定要記得釋放資源,因為GC回收不了它.如果不釋放的話,會造成記憶體洩漏.
3 工具類程式碼
publicclass UserThreadLocal { private static ThreadLocal<User> userThread = new ThreadLocal<>(); public static void set(User user){ userThread.set(user); } public static User get(){ return userThread.get(); } //防止記憶體洩漏public static void remove(){ userThread.remove(); } }
(二)實現單點登入流程
1 需求分析
根據分散式的思想,需要將服務進行拆分.拆分完成後為了抗擊高併發,搭建tomcat伺服器叢集.但是現在遇到的問題是,使用者訪問系統時需要頻繁地登入.
2 解決方案
問題:如果使用者沒有登入,則不允許執行敏感操作(查詢訂單/查詢物流)
因為採用叢集的搭建方式,所以session不能共享.
解決:(以上圖為例)
- 當用戶輸入使用者名稱和密碼後點擊登入按鈕後,系統訪問jt-web
- jt-web接收使用者的資料後經過加密處理後,請求JT-SSO進行資料校驗
- JT-SSO接收請求後,進行使用者資訊的校驗.如果根據資料查詢,使用者不存在,使用者輸入的使用者名稱或者密碼錯誤,則直接返回錯誤提示(state:201). 如果使用者名稱和密碼正確,則開始實現單點登入.
- 生成加密的祕鑰TOKEN,之後將user資料轉化為userJSON資料,將資料儲存到redis中.token充當key,userJSON充當value.
- JT-SSO將使用者登入的祕鑰token返回給JT-WEB
- JT-WEB將token資料返回給使用者,將token資料儲存到使用者瀏覽器的cookie中
- 如果使用者再次訪問JT-WEB時,獲取cookie中的TOKEN,查詢Redis快取伺服器.如果有資料,則證明使用者已經登入.則進行資料回顯.如果使用者返回資料為null,表示沒有登入.則根據具體的業務實現再定.
功成名就不是目的,讓自己快樂,這才是生活的意義.