(轉:https://my.oschina.net/wanglihui/blog/150726)
手機客戶端與服務器端的通信,不同於瀏覽器與服務器端的通信。瀏覽器和服務器端的通信依靠session去維持一個會話, 當這一切搬到手機上仿佛一切都失效了。
1.在上一家公司的時候公司同事曾經問過我這個問題, 我當時想的解決辦法是通過將sessionID附加到網址后面,或者放到hearder頭中,維持會話。
2.或者干脆不維持會話,每次請求都通過簽名認證,調用接口,拿數據。當然這樣的效率肯定是最低的
3.到了新公司,看到google大牛推薦的一種方式。根據這種方式構建了一種類似於session的機制,一下主要是我的實現(有好的見解,歡迎噴~~):
1.用戶表
mysql> desc auth_member;
+---------------------------+--------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |
+---------------------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| username | varchar(50) | YES | UNI | NULL | |
| password | varchar(50) | YES | | NULL | |
| realname | varchar(50) | YES | | NULL | |
| email | varchar(100) | YES | UNI | NULL | |
| registry_time | datetime | YES | | NULL | |
| registry_ip | varchar(50) | YES | | NULL | |
| last_login_time | datetime | YES | | NULL | |
| update_time | datetime | YES | | NULL | |
| last_password_update_time | datetime | YES | | NULL | |
| total_login_times | int(11) | YES | | NULL | |
| avatar | varchar(255) | YES | | NULL | |
| is_first_login | int(11) | YES | | NULL | |
| delete_flag | int(11) | YES | | NULL | |
+---------------------------+--------------+------+-----+---------+----------------+
16 rows in set (0.00 sec)
2.token表
mysql> desc auth_log_token;
+--------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| uid | int(11) | YES | | NULL | |
| token | varchar(50) | YES | | NULL | |
| create_time | datetime | YES | | NULL | |
| refresh_time | datetime | YES | | NULL | |
| valid_time | datetime | YES | | NULL | |
| is_valid | int(11) | YES | | NULL | |
+--------------+-------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)
id 標識,uid用戶Id,token類似於session的唯一串根據一定算法聲稱,create_time生成時間,refresh_time 刷新時間,valid_time失效時間,is_valid是否失效
運作:
1.用戶登錄: https://(請求) username+password通過簽名認證, 獲取token,默認token有效時間可以根據用戶設置的記住密碼時間,或者默認30min
2.用戶通過接口獲取數據:用戶請求服務器接口需要攜帶token和username,通過判斷token是否有效,token和傳遞的用戶名是否匹配等,驗證token合法性
3.每次驗證token成功更新refresh-time字段,valid_time時間更新,增加token有效時間
4.如果要構造單點登錄,用戶每次登陸判斷token表中uid記錄是否存在,如果存在直接更新;如果構建多點登陸,用戶每次登陸,直接在token表中插入新記錄。用戶退出,直接將is_valid字段設為1(即已經失效),valid_time 設置為當前時間
