分散式環境Session處理方法
最近做的一個專案中,操作的時候需要對手機號進行簡訊驗證。
對簡訊驗證的步驟:
一、獲取驗證碼,把獲取得到的驗證碼儲存到該使用者的session中
二、然後把該驗證碼以簡訊的方式傳送到手機上。
三、使用者在進行操作的時候,所要提交的表單中需要包含,要操作的資訊和輸入的驗證碼。
後臺會把使用者輸入的驗證碼與session中的驗證碼進行對比,如果驗證通過,則可以進行後續的操作。
在這個流程中,驗證碼存到session中,之後驗證碼的校驗 是這個流程的關鍵。
我所做的專案是一個分散式的專案,所以存在session共享的問題。即傳送簡訊的功能與要操作的功能沒在同一個模組中。這樣的話,如果session儲存到傳送簡訊模組的session中之後,後續操作的模組中並不能獲取到session中的資訊。
為了解決以上遇到的問題,需要處理的問題是,session如何在分散式環境上共享。
網上提供了三種常用的分散式環境,管理session的方案:
一、session複製
將一臺機器上的Session資料以廣播的形式釋出到其餘機器上
二、session繫結
指的是如果機器A有使用者A的session資訊,那麼使用者A在訪問的時候,仍被分配到機器A上,(如上的例子,則需要單獨去簡訊模組中進行驗證)
三、Session集中式管理
這種方式,是建立一個單獨的伺服器,共同處理叢集中的session資訊。
權衡一下這幾種方案,第一種方案中 每臺機器上都存有大量的session資訊,對網路的依賴較大。第二種方案中,session資訊只存在指定的某臺機器上,如果某臺機器down掉之後,會有使用者資訊的丟失。
結合上面的幾種優缺點。決定還是使用第三種方案,如果為了考慮可用性,可以建立多個伺服器管理session。
最終採用的解決方案,使用者獲取驗證碼之後,把驗證碼儲存到redis裡面。然後使用者在操作之後,把輸入的驗證碼與存到session中的驗證碼對比,如果驗證碼正確則可以繼續操作。