这个问题太过于常见,也过于简单,以致于大部分开发者根本没有关注过这个问题,我根据和我沟通的开发者中,总结出来经常使用的方法有如下几种: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/