手机客户端和服务器端通信
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
手機(jī)客戶端與服務(wù)器端的通信,不同于瀏覽器與服務(wù)器端的通信。瀏覽器和服務(wù)器端的通信依靠session去維持一個(gè)會(huì)話,?當(dāng)這一切搬到手機(jī)上仿佛一切都失效了。
1.在上一家公司的時(shí)候公司同事曾經(jīng)問過我這個(gè)問題,?我當(dāng)時(shí)想的解決辦法是通過將sessionID附加到網(wǎng)址后面,或者放到hearder頭中,維持會(huì)話。
2.或者干脆不維持會(huì)話,每次請求都通過簽名認(rèn)證,調(diào)用接口,拿數(shù)據(jù)。當(dāng)然這樣的效率肯定是最低的
3.到了新公司,看到google大牛推薦的一種方式。根據(jù)這種方式構(gòu)建了一種類似于session的機(jī)制,一下主要是我的實(shí)現(xiàn)(有好的見解,歡迎噴~~):??
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 標(biāo)識,uid用戶Id,token類似于session的唯一串根據(jù)一定算法聲稱,create_time生成時(shí)間,refresh_time 刷新時(shí)間,valid_time失效時(shí)間,is_valid是否失效??
運(yùn)作:
1.用戶登錄: https://(請求) ?username+password通過簽名認(rèn)證,?獲取token,默認(rèn)token有效時(shí)間可以根據(jù)用戶設(shè)置的記住密碼時(shí)間,或者默認(rèn)30min
2.用戶通過接口獲取數(shù)據(jù):用戶請求服務(wù)器接口需要攜帶token和username,通過判斷token是否有效,token和傳遞的用戶名是否匹配等,驗(yàn)證token合法性
3.每次驗(yàn)證token成功更新refresh-time字段,valid_time時(shí)間更新,增加token有效時(shí)間
4.如果要構(gòu)造單點(diǎn)登錄,用戶每次登陸判斷token表中uid記錄是否存在,如果存在直接更新;如果構(gòu)建多點(diǎn)登陸,用戶每次登陸,直接在token表中插入新記錄。用戶退出,直接將is_valid字段設(shè)為1(即已經(jīng)失效),valid_time 設(shè)置為當(dāng)前時(shí)間???
轉(zhuǎn)載于:https://my.oschina.net/wanglihui/blog/150726
總結(jié)
以上是生活随笔為你收集整理的手机客户端和服务器端通信的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么用Spring来管理Hiberna
- 下一篇: 【项目经验】如何用TexturePack