account-service的目的是封裝下層細節,對外暴露盡可能簡單的接口。先看一下這個接口是怎樣的,見代碼清單12-3。
代碼清單12-3 AccountService.java
正如4.3.1節介紹的那樣,該接口提供5個方法。generateCaptchaKey()用來生成一個驗證碼的唯一標識符。generateCaptchaImage()根據這個標識符生成驗證碼圖片,圖片以字節流的方式返回。用戶需要使用signUp()方法進行註冊,註冊信息使用SignUpRequest進行封裝,這個SignUpRequest類是一個簡單的POJO,它包含了註冊ID、email、用戶名、密碼、驗證碼標識、驗證碼值等信息[1]。註冊成功之後,用戶會得到一個激活鏈接,該鏈接包含了一個激活碼,這個時候用戶需要使用activate()方法並傳入激活碼以激活賬戶。最後,login()方法用來登錄。
下面來看一下該接口的實現類AccountServiceImpl.java。首先它需要使用3個底層模塊的服務,如代碼清單12-4所示。
代碼清單12-4 AccountServiceImpl.java第1部分
三個私有變量來自account-persist、account-email和account-captcha模塊,它們都有各自的get()和set()方法,並且通過Spring注入。
AccountServiceImpl.java借助accountCaptchaService實現驗證碼的標識符生成及驗證碼圖片生成,如代碼清單12-5所示。
代碼清單12-5 AccountServiceImpl.java第2部分
稍微複雜一點的是signUp()方法的實現,見代碼清單12-6。
代碼清單12-6 AccountServiceImpl.java第3部分
signUp()方法首先檢查請求中的兩個密碼是否一致,接著使用accountCaptchaService檢查驗證碼,下一步使用請求中的用戶信息實例化一個Account對象,並使用accountPersistService將用戶信息保存。下一步是生成一個隨機的激活碼並保存在臨時的activateMap中,然後基於該激活碼和請求中的服務器URL創建一個激活鏈接,並使用accountEmailService將該鏈接發送給用戶。如果其中任何一步發生異常,signUp()方法會創建一個一致的AccountServiceExcpetion對象,提供並拋出對應的異常提示信息。
最後再看一下相對簡單的activate()和login()方法,見代碼清單12-7。
代碼清單12-7 AccountServiceImpl.java第4部分
activate()方法僅僅是簡單根據激活碼從臨時的activationMap中尋找對應的用戶ID,如果找到就更新賬戶狀態為激活。login()方法則是根據ID讀取用戶信息,檢查其是否為激活,並比對密碼,如果有任何錯誤則拋出異常。
除了上述代碼之外,account-service還包括一些Spring配置文件和單元測試代碼,這裡就不再詳細介紹。有興趣的讀者可以自行下載閱讀。
[1] 由於篇幅的原因,這裡不再給出源代碼,有興趣的讀者可以自行下載並查看本書源碼。