當前位置:
首頁 > 最新 > 你是如何拿到登陸用戶信息的

你是如何拿到登陸用戶信息的

說到Java web,那麼在web端獲取登陸用戶信息幾乎是所有系統都需要實現的功能,下面我們就來講一下幾種獲取登陸用戶信息的方法。

從session中獲取

這是我們剛剛接觸Java web時就了解的一種解決方案,配置一個登陸過濾器或者登陸攔截器,在用戶登陸的時候將用戶信息放到session中,然後控制層在session中取出用戶信息,這是最簡單也是最常見的一種解決方案。

隨著用戶量的增大,單部署的服務往往不能滿足我們的需求,這時候往往我們會引入集群來分攤伺服器的壓力。但是引入集群後,從session中存取用戶信息就會變得不那麼靠譜了。

大家都知道session是存在服務端的,那麼如果用戶在集群機器A中登陸,用戶信息就存儲在了機器A上,此時如果用戶新的請求被分發到集群機器B上,就無法獲取用戶信息了。

這是集群情況下用戶信息被存儲在集群中的單個伺服器上導致的,解決方案主要有兩種:

讓用戶後續的所有請求都分發到用戶登陸的那台機器

把用戶信息存儲在緩存中間件中,而不是集群中的每個伺服器上

第一種方案可以在代理伺服器(apache,nginx等)上配置session黏著,這樣就能保證用戶後續請求都會被路由到同一台機器上,這就解決了集群情況下拿不到用戶信息的問題了。

當然,對ip進行hash演算法使某一個用戶的請求永遠隨機到某一台機器上也是一種思路。

從緩存中間件獲取

從緩存中間件獲取,就是把用戶信息存儲在緩存中間件中,控制層直接從緩存中間件中獲取用戶信息。

用戶在登陸成功後,會生成一個token,然後以token為鍵,用戶信息為值存儲在緩存中間件中,並且把token發送到頁面端。

頁面端向服務端發送請求的時候帶上這個token,服務端控制層可以根據這個token從緩存中間件中獲取用戶信息。

在集群情況下,用戶信息還是存儲在一個獨立出來的緩存伺服器上,這樣就可以避免獲取不到用戶信息的問題了。

以上兩種方法就是獲取登陸用戶信息的兩種主要解決方案了,這裡再從代碼層面上給出一個小分享。

不論是從session中獲取還是從緩存中間件中獲取用戶信息,不可避免的是在控制層需要顯式的去獲取用戶

或者

幾乎每個控制層方法都需要執行上面的語句獲取一下用戶信息,著就會顯得很羅嗦,所以下面給出一個小分享來使用註解和HandlerMethodArgumentResolver結合優化控制層代碼。

我們先來了解一下HandlerMethodArgumentResolver, SpringMvc中的HandlerAdapter會檢測所有的 HandlerMethodArgumentResolver,對參數進行處理和加工。

這樣,我們就可以自定義一個HandlerMethodArgumentResolver,讀取請求中的token,根據token獲取到用戶信息,將用戶信息通過自定義註解的方式傳遞到控制層。

沒錯,這個小分享是基於SpringMVC的,下面給出詳細代碼。

首先自定義一個註解,用來傳遞用戶信息

自定義一個HandlerMethodArgumentResolver,用來獲取用戶信息

控制層獲取用戶信息

通過上面的Logined註解和LoginedArgumentResolver結合,在控制層中需要獲取用戶信息,只需要在參數中添加@Logined就可以了,是不是簡單了很多呢,希望今天的分享可以給大家帶來幫助。

雖然每次分享的文章大多數東西都比較基礎,大家可能都懂,但是只要文章中有一兩個點能給大家帶來幫助我就很知足了。公眾號剛剛起步,希望大家多多支持,幫忙擴散一下,謝謝。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 lebron的地方 的精彩文章:

TAG:lebron的地方 |