網站的自動登陸一直都是有利於提升用戶體驗的功能,若是設計很差,也很是容易泄漏用戶的帳戶信息。 java
比較常見的功能實現方案是將用戶的登陸信息保存在瀏覽器的Cookie中。看到一些設計有缺陷的網站會將用戶的用戶名和密碼信息保存在Cookie中,這種作法是至關危險的。雖然這樣的設計比較簡單,功能比較容易實現,可是卻大大提升了泄露用戶帳戶信息的概率,即便保存的用戶密碼等信息都是通過加密的,但也是不可取的,畢竟如今弱一點的密碼加密後也是能夠解密的。 算法
固然自動登陸的功能設計必需要在瀏覽器的Cookie中保留帳戶的登陸憑證(token),這個登陸憑證是被看成用戶登陸的登陸鑰匙。用戶在登陸時,憑藉瀏覽器發送的token與服務器端保存的token作比較,若2個token一致,則經過驗證,若不一致,則驗證失敗。 數據庫
token的產生最好具備必定的隨機性,能夠加入日期,隨機數等等,而後經過一些不可逆的算法加密,如: 瀏覽器
String token = Utils.MD5(user.getUsername() + System.currentTimeMillis());
樣token就不會泄露用戶的信息,安全性上獲得了保證。token產生後,先將其保存到數據庫中,用於之後的驗證,接着將其發送給瀏覽器,保存在客戶端的Cookie中。參考代碼以下,這裏Cookie的有效設置爲10天,也就說10後,這個Cookie就會失效: 安全
Cookie cookieToken = new Cookie("token", token); cookieToken.setMaxAge(10 * 24 * 60 * 60); // 10 days cookieToken.setPath("/"); response.addCookie(cookieToken);
當用戶登陸咱們的網站後,到瀏覽器中查看Cookie信息,就會發現有token的記錄: 服務器
此時token的值就是上面代碼中通過MD5加密的值,做用域名爲咱們的網站域名(這裏是測試環境,因此此處的域名是localhost),有效路徑爲/,即根目錄,有效期到2013年12月27號。 cookie
根據瀏覽器管理Cookie的機制,當用戶退出登陸後再次瀏覽咱們的網站時,瀏覽器在向服務器發送URL的同時,依舊會帶上Cookie的信息,以下圖中所示: app
下面是在Spring MVC框架下用戶請求登陸頁面的實現代碼(此處的功能應該加在檢測是否登陸的Filter中,由於用戶的每次請求都會驗證用戶是否登陸,若未登陸,便可在驗證token,經過token來實現自動登陸): 框架
@RequestMapping(value = "/login", method = RequestMethod.GET) public String login(@CookieValue(value="token", required=false) String token) { if (!StringUtils.isEmpty(token)) { if (this.userService.checkToken(token)) { updateCookie(); // 刷新token createSession(); // 建立Session return "redirect:/user/list"; } } return "admin/login"; }
瀏覽器在請求登陸界面的時候,會帶上token,這時候服務器端的程序會拿到這個token,若是token存在且不爲空,會將它與存放在數據庫中的token進行比較,若一致,則經過驗證,登陸成功;若不一致,則登陸失敗。 測試
驗證成功: 更新token,也就說一個token只能登陸驗證一次,驗證成功後,就會更換新的token
驗證失敗: 跳轉到登陸頁面
對於大部分的網站來講,這樣的設計基本上可以保證用戶的帳戶安全,若要求安全性再高一點,能夠同時加入對訪問ip的驗證,這樣驗證機制就是token + ip雙重驗。不足之處就是ip獲取的準確性不夠,若用戶以前使用了代理訪問,那麼先後ip就出現了不一致,沒法自動登陸。