一。一種方式
原文鏈接:http://ciniao.legu.cc/appcan/article_54.html
這個問題太過於常見,也過於簡單,以至於大部分開發者根本沒有關注過這個問題,我根據和我溝通的開發者中,總結出來常用的方法有以下幾種:
(個人覺得不簡單么)
一:服務端默認的session
這種方式最大的優點是服務端不用增加任何代碼,但APP與網站不同,通常情況下,我們會希望APP的登陸狀態能維持數天,甚至數月之久,大部分的服務端程序,都會在進程重啟時或客戶端多久不活動時,將session全部清空,致使狀態丟失
二、在客戶端記錄登陸用戶的用戶名和密碼
客戶端在登陸時,判斷如果服務端返回驗證成功,則將用戶名和密碼(為了客戶端安全起見,可以將password多次md5)保存到本地的localStorage中,然后每次HTTP請求時,將用戶名和密碼帶到參數中,服務端每次都需要讀取數據庫判斷合法性,會浪費一定的服務器資源,同時,因為密碼保存到本地,帶來了一定的安全風險。
三:借助於數據庫或文件系統等維持持久狀態
這種方式,是為了解決方法一中session不持久的問題(如:將session保存的位置修改到文件或數據庫),以及方案二中的安全性問題,不過這會降低服務端性能,或浪費服務端資源,代碼邏輯流程如下:
數據庫中,除了常見的user,password之外,額外增加一個字段,如:sessionID
在登陸接口中,如果判斷用戶輸入的用戶名密碼正確時,生成一個隨機字符串,保存到sessionID中,同時,客戶端也將該值保存,在每次請求時,傳遞該值,服務端通過該值查詢數據庫,取得用戶的身份信息。
四:密鑰方式
以上三種方法,要么不能持久保存狀態,要么不安全,要么每次請求都需要讀取數據庫驗證,有沒有一種方法,能解決以上的缺陷呢,於是,就有了這個方法,流程如下:
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
哎,失誤了,不用考慮后台該考慮的事情了。
2015/12/03
1.app端與server端的心跳包:長鏈接,適合TCP/IP
http方式,后台session的自動延續,session設置超時時間,到期自動延續。app端不會出現session過期。
2.Image的蒙層效果。
實現點擊圖片(ImageView)變暗效果,有一個較簡單的方法,就是將目標圖片設置為背景圖片(setBackground),再創建一個selector.xml文件,里面放置一張普通狀態時的透明圖片,一張點擊狀態下的棕色半透明圖片,將其設置為ImageView的源圖片。這樣在點擊ImageView時,源圖片會變換透明度,達到變暗效果。但這種方法有個缺點:由於源圖片已經被限制死了,假如我們需要自定義背景圖片,將目標圖片放置在背景圖片上,就無法實現了。
多用一個ImageView控件,半透明背景的,放在目標ImageView的上面,點擊的時候換另一種透明度背景的。這個方法用了兩層
還可以通過濾鏡和監聽onTouchEvent事件來達到變暗效果的方法。關於濾鏡,以后接觸