1. 程式人生 > >專案中瑣碎知識(三)

專案中瑣碎知識(三)

(一)ThreadLocal

    動態的獲取資訊

  1 需求分析

    如果將使用者資訊儲存到?Session域中,那麼需要在Controller方法中必須新增request物件.

  但是想在任何地方獲取使用者資訊應該怎麼辦??

  解決方案:   ThreadLocal

  2 功能原理

    ThreadLocal(本地執行緒變數)在一個執行緒內,實現資料的共享,執行緒是安全的.

    但是使用它的時候一定要記得釋放資源,因為GC回收不了它.如果不釋放的話,會造成記憶體洩漏.

    

  

  3 工具類程式碼

public
class 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不能共享.

  解決:(以上圖為例)

  1. 當用戶輸入使用者名稱和密碼後點擊登入按鈕後,系統訪問jt-web
  2. jt-web接收使用者的資料後經過加密處理後,請求JT-SSO進行資料校驗
  3. JT-SSO接收請求後,進行使用者資訊的校驗.如果根據資料查詢,使用者不存在,使用者輸入的使用者名稱或者密碼錯誤,則直接返回錯誤提示(state:201). 如果使用者名稱和密碼正確,則開始實現單點登入.
  4. 生成加密的祕鑰TOKEN,之後將user資料轉化為userJSON資料,將資料儲存到redis中.token充當key,userJSON充當value.
  5. JT-SSO將使用者登入的祕鑰token返回給JT-WEB
  6. JT-WEB將token資料返回給使用者,將token資料儲存到使用者瀏覽器的cookie中
  7. 如果使用者再次訪問JT-WEB時,獲取cookie中的TOKEN,查詢Redis快取伺服器.如果有資料,則證明使用者已經登入.則進行資料回顯.如果使用者返回資料為null,表示沒有登入.則根據具體的業務實現再定.

 

 


 

          功成名就不是目的,讓自己快樂,這才是生活的意義.