我相信有很多IT者都會遇到公司要求網站可以實現自動登錄,那什么是自動登錄呢?
所謂自動登陸就是當用戶第一次訪問網站時,輸入用戶名和密碼,然后勾選了自動登陸復選框,進入首頁后,點擊退出登陸,關閉網頁,再次打開同樣的網站,則無需再次輸入賬號密碼,直接進入首頁,這種交互方式就是“自動登錄”,這是非常好的用戶體驗,但是具體怎么實現這些功能呢,下面給大家介紹一下我的理解和實現方式。
大家用過京東和淘寶的想必都知道,登陸京東后,發現賬戶信息已經顯示在首頁,可以直接進行購物和付款,這種體驗就是我們要追求的方式。
為何瀏覽器打開,網站就會自動登陸呢,那說明打開網站的時候,瀏覽器向服務器端發送了一個憑證(Token也可叫鑰匙),告訴服務器,我是你的真實用戶,可放心開門,既然瀏覽器端需要提供憑證,那我們肯定會想到Cookie,只有Cookie才能在客戶端永久保存,客戶端從Cookie中提取信息后,服務器端識別后才能知道真偽,那說明服務器端是需要核驗的。
到此,我們的思路已經出來了,要實現自動登陸:
1.用戶登陸網站時,選擇“N周內免登錄”。
2.用戶登陸成功后需要在瀏覽器端保存Cookie信息,同時服務器端數據庫中也需要記錄同樣的信息。
3.當用戶訪問時,讀取客戶端中cookie信息,到服務器端數據庫進行核驗,信息一致時直接獲取用戶信息保存session,跳轉到首頁。
以上是我幫助大家分析的思路,那下面我們就會具體去講這些方案。
既然是cookie實現,那么cookie一定可以被偽造的,所以上述的方案有以下安全隱患:
1.修改用戶名,這樣就可以隨便用其他人的賬號登錄了;
2.修改cookie的有效期,這樣當別人拿到你的電腦的時候,即使已經過了cookie的有效期,仍然可以登陸。
既然我們都知道Cookie是有安全隱患的,但是我們不用又不行,因此,我們能做的就是降低風險:
1.通過將cookie中保存的信息進行加密處理,用戶登陸成功以后,將時間戳和隨機數合並通過MD5加密處理形成Token。
String token = Utils.MD5(System.currentTimeMillis()+Math.Rand(0,9999999));
當然,也可以通過用戶名+系統時間生產Token或者將sessionId加密生產Token也可以。
2.將用戶ID(uid或者userName)和有效時間(1個月)以及Token保存在cookie中,同時記錄到數據庫表中(Remember_Key)。
3.用戶訪問網站時,后台讀取Cookie,獲取uid和Token,去數據庫對比,如果都存在,且在有效期內,則通過uid直接獲取用戶信息並保存session,直接跳轉到首頁。
前端可對此進行處理,獲取到后台返回的數據后,展示用戶名以及頭像信息等。
4.后台需要做過濾器,過濾網站的所有頁面,每當打開頁面時,首先判斷是否登陸,如果已經登陸則跳過,如果未登陸,需要先讀取Cookie,判斷是否匹配,如果匹配則跳過登陸,直接獲取用戶信息,否則跳轉到登陸頁面。
后台表設計:
id | user_id | token | expires_date | create_time | update_time |
1 | 41000000 | NGyuswVwxnXxz4BI1F1UyNoWWrxcuRiadPYpJcVTMN9DmDYrNvCEDdwMOS6o522JY8FPtQsLg | 1456381021993 | 2016-02-25 | 2016-02-25 |