這個問題太過於常見,也過於簡單,以致於大部分開發者根本沒有關注過這個問題,我根據和我溝通的開發者中,總結出來經常使用的方法有如下幾種:html
(我的以爲不簡單麼)java
一:服務端默認的session數據庫
這種方式最大的優勢是服務端不用增長任何代碼,但APP與網站不一樣,一般狀況下,咱們會但願APP的登錄狀態能維持數天,甚至數月之久,大部分的服務端程序,都會在進程重啓時或客戶端多久不活動時,將session所有清空,導致狀態丟失安全
2、在客戶端記錄登錄用戶的用戶名和密碼服務器
客戶端在登錄時,判斷若是服務端返回驗證成功,則將用戶名和密碼(爲了客戶端安全起見,能夠將password屢次md5)保存到本地的localStorage中,而後每次HTTP請求時,將用戶名和密碼帶到參數中,服務端每次都須要讀取數據庫判斷合法性,會浪費必定的服務器資源,同時,由於密碼保存到本地,帶來了必定的安全風險。微信
三:藉助於數據庫或文件系統等維持持久狀態session
這種方式,是爲了解決方法一中session不持久的問題(如:將session保存的位置修改到文件或數據庫),以及方案二中的安全性問題,不過這會下降服務端性能,或浪費服務端資源,代碼邏輯流程以下:app
數據庫中,除了常見的user,password以外,額外增長一個字段,如:sessionID微信公衆平臺
在登錄接口中,若是判斷用戶輸入的用戶名密碼正確時,生成一個隨機字符串,保存到sessionID中,同時,客戶端也將該值保存,在每次請求時,傳遞該值,服務端經過該值查詢數據庫,取得用戶的身份信息。memcached
四:密鑰方式
以上三種方法,要麼不能持久保存狀態,要麼不安全,要麼每次請求都須要讀取數據庫驗證,有沒有一種方法,能解決以上的缺陷呢,因而,就有了這個方法,流程以下:
1:客戶端輸入用戶名和密碼,提交到服務端驗證
2:服務端驗證成功後,給客戶端返回如下值:
uid : 用戶的惟一標示
time : 當前unix時間戳
key : MD5(uid+time+"一個只有你本身知道的字符串密鑰")
3:客戶端保存以上3個值在本地,每次HTTP請求時,將以上3個值發送到服務端
4:服務端驗證key,判斷若是與客戶端發送的key一致,則說明用戶身份無誤
5:服務端每次收到請求時,經過當前時間-客戶端time字段獲得的差值,能夠控制這個key的有效期
二。相似第三方登陸的方式
或者微信公衆平臺的方式:
http://mp.weixin.qq.com/wiki/11/0e4b294685f817b95cbed85ba5e82b8f.html
三。app 利用memcached 保持登陸
http://www.zhihu.com/question/29714299
http://www.blogjava.net/stevenjohn/archive/2013/04/03/397372.html
http://ask.dcloud.net.cn/article/157
四。安全角度:從安全和體驗上解析移動App的登陸
不過我的建議你長期保持登錄
這樣安全性很差
最好是 自動登陸~提供自動登陸
至於session機制,也是須要服務器後臺設置時長的。
http://baike.baidu.com/view/3858474.htm
http://tech.it168.com/j/2006-07-19/200607191220593_2.shtml
哎,失誤了,不用考慮後臺該考慮的事情了。
1.app端與server端的心跳包:長連接,適合TCP/IP
http方式,後臺session的自動延續,session設置超時時間,到期自動延續。app端不會出現session過時。
2.Image的蒙層效果。
實現點擊圖片(ImageView)變暗效果,有一個較簡單的方法,就是將目標圖片設置爲背景圖片(setBackground),再建立一個selector.xml文件,裏面放置一張普通狀態時的透明圖片,一張點擊狀態下的棕色半透明圖片,將其設置爲ImageView的源圖片。這樣在點擊ImageView時,源圖片會變換透明度,達到變暗效果。但這種方法有個缺點:因爲源圖片已經被限制死了,假如咱們須要自定義背景圖片,將目標圖片放置在背景圖片上,就沒法實現了。
多用一個ImageView控件,半透明背景的,放在目標ImageView的上面,點擊的時候換另外一種透明度背景的。這個方法用了兩層
還能夠經過濾鏡和監聽onTouchEvent事件來達到變暗效果的方法。關於濾鏡,之後接觸
詳細介紹請查看全文:https://cnblogs.com/qianzf/
原文博客的連接地址:https://cnblogs.com/qzf/