Android 分析android 客户端保持session 不过期的方式

最近遇到个问题,和朋友讨论小电商如何保持session不过期的问题,因为通常我们很多客户端是session是做成永久不过期的方式,只有重新登录了,生成新的session给客户端,电商因为同时如果几个端一起登录,同时又购买同一个物品的时候,可能就会出现奇奇怪怪的问题,比如死锁,数据金额可能异常各种问题,所以需要做一个session会过期的登录方式,比如你ios登录了,安卓端就需要被踢出来,总结和分析了看有如下三种方式:

最后我们默认是会选第二或第三种方式会比较可行。

首先要知道session和cookie,session是存在服务器的的用来区分不同的会话的,是一种服务器机制,cookie 是客户端登陆服务器以后,服务器需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否包含了一个session标识-称为session id,如果已经包含一个session id则说明以前已经为此客户创建过session,服务器就按照session id把这个session检索出来使用.如果客户请求不包含session id,则为此客户创建一个session并且生成一个与此session相关联的session id,这个session id将在本次响应中返回给客户端保存。

一般开源框架都会把这个session_id 存贮在cookie中,注意这个session_id是会话的标识。不要直接明文存储。

回归正题,客户端登录时,将用户名,密码加密存贮在本地。同时将将cookie(或者session_id)保存起来,下次访问服务器是,把它带上,服务器端就能识别你已经登陆过了,但是我们知道服务器的session 是有时间限制的,默认是如果客户端20分钟以内没有访问服务器,这个session_id就过期了,在服务器端不存在了,但是客户端可能还认为自己没有掉线。怎么解决这个问题呢?
方案1、将session 设置成拥挤不过期,这样确实可以解决客户端的session 过期的问题,但是不推荐。这样服务器端session一直不销毁,会占用内存,越来越来越多。
方案2.心跳机制。这是最常见的客户端保持会话不过期的方法。简单的做法就是写个定时器,美隔几分钟发送广播,收到广播后收客户端去访问服务器。当然也有问题。这个方式。举个例子说下他的问题吧。比如虽然写了个定时器去访问服务器,但是如果这段时间(假如30分钟),客户端正好把网络给关了,31分钟后客户端又打开了网络连接,由于30分钟没有访问服务器 你调用A()方法的时候返回的结果是{“error”:"login"},然后你根据结果再去调用B() 登陆方法,登陆成功后,在自动A()方法。这样的话,每次访问网络都要更这个B()登陆方法,代码臃肿。而且费电。
方法3:服务器自动登登陆的方法
客户端访问服务器事,同时带着用户名,和密码,还有cookie(session_id),服务器先判断session_id 是否过期,如果过期,在判读参数中有用户名和密码,如果有,就在调用一下登录的方法,登录成功后,就接着操作。。这种方法的缺点就是每次都要带个账号和密码,稍微有点耗流量。

参考原文地址:http://www.th7.cn/Program/Android/201502/392240.shtml

猜你喜欢

转载自my.oschina.net/u/3318187/blog/1788073