使用Redis實現分散式會話
1. 概述
傳統的單體應用中,使用者是否登入,通常是通過從Tomcat容器的session中獲取登入使用者資訊判斷的。
但在分散式的應用中,通常負載均衡了多臺Tomcat,每臺Tomcat都有自己獨立的session,使用者的每次請求都可能到達不同的Tomcat,因此可能會出現需要登入多次或者登入無效的情況出現。
為了解決這個問題,就需要使用一個快取中介軟體,將登入使用者的資訊存入這個快取中介軟體,所有的Tomcat都從快取中介軟體中獲取登入使用者資訊,從而判斷登入狀態。
Redis就是一個很好用的快取中介軟體,接下來我們就來聊聊分散式應用該如何實現使用者登入的邏輯。
2. 單體應用的使用者登入
傳統的單體應用,通常只有一個Tomcat。
使用者提交登入資訊時,後臺會根據使用者登入名,得到使用者資訊,然後比對密碼,如果正確,則將使用者資訊放入Tomcat的session中。
使用者請求需要登入的介面時,先從Tomcat的session中得到使用者資訊,如果使用者資訊是null,則介面無法訪問,提示使用者登入。如果使用者資訊不為null,則使用使用者資訊完成介面邏輯。
3.分散式應用的使用者登入
3.1 方案一:允許使用者異地登入
使用者提交登入資訊時,後臺根據使用者登入名,得到使用者資訊,然後比對密碼,如果正確,則生成一個隨機數。
以這個隨機數為key,使用者資訊為value,存入redis。
在cookie中存入一個固定值的key,例如:mySessionId,value為這個隨機數。
使用者請求需要登入的介面時,先從cookie中拿到隨機數,然後以隨機數為key,從redis中得到使用者資訊,如果使用者資訊不為null,則表示使用者已登入。
使用者登出登入時,將cookie中的隨機數和redis中的使用者資訊都清空。
3.2 方案二:不允許使用者異地登入(以新登入的為準)
使用者提交登入資訊時,後臺根據使用者登入名,得到使用者資訊,然後比對密碼,如果正確,則生成一個隨機數。
將這個隨機數放入使用者資訊中,在cookie中存入一個固定值的key,例如:curUser,value是脫敏後的使用者資訊。
以使用者ID為key,這個隨機數為value,存入redis。
使用者請求需要登入的介面時,先從cookie中拿到使用者資訊,然後以使用者資訊中的使用者ID為key,從redis中得到隨機數。
如果redis中隨機數不存在,則表示沒有登入,如果存在,使用redis中得到的隨機數與cookie中使用者資訊中的隨機數做對比,如果不一致,則表示使用者在其他地方登入,需要重新登入。
使用者登出登入時,將cookie中的使用者資訊和redis中的隨機數都清空。
4.綜述
今天簡單聊了一下使用redis實現分散式會話,希望能對大家的工作有所幫助。
歡迎大家多多評論交流,共同成長。
關注追風人聊Java,每天更新Java乾貨。