在移动开发中登入后经常碰到访问接口被弹回登入,或者提示重新登入问题,其原因在于访问服务器的会话并非一个。
解决办法,使用同一个会话
//connManager, params分别是设置超时和初始化。
DefaultHttpClient httpClient = new DefaultHttpClient(connManager, params);
// 将uefEntity参数设置到post请求中
httpPost.setEntity(uefEntity);
// 发送post请求,同时也将entity中的各参数发送过去,获得到响应对象
HttpResponse httpResponse = httpClient .execute(httpPost);
如果这里不手动关闭 httpClient 或者不被系统回收,那么你就可以一直使用这个httpClient而不被服务器拦截。
这里和网页访问服务器的原理基本一致,比如用firefox登入后在新打开一个窗口会保持登入状态,而同一台电脑的Goole浏览器打开同一链接却是未登入状态。这是因为访问服务器的时候,服务器会根据访问会话的cookie来判定你是否可以通过。
但是在Android端无法控制系统回收,即使我们将 httpClient设置为 static类型任然会有数据丢失的时候,这时候我们就会被逼的去重新登入。解决办法 我们通过设置httpClient的co'okie来使服务器知道,啊@这家伙跟我有会话链接了,从而放行。
在刚刚 DefaultHttpClient httpClient = new DefaultHttpClient(connManager, params); 的时候我们通过httpClient.getCookieStore();是不对的你可以用log打印下结果为空,原因不用说了吧,这个时候还没有跟服务器建立链接,
当httpClient .execute(httpPost);登入后我们获取的才是 本次会话的cookie值,
List<Cookie> cookies = httpClient.getCookieStore().getCookies();
我们需要将获取的cookies 进行持久化才能保证不会丢失。
将cookies持久化,不会的点进
( 是使用SharedPreferences来保存)
http://blog.csdn.net/shimiso/article/details/39033353?utm_source=tuicool
http://blog.csdn.net/junjieking/article/details/7658551 ( 是使用数据库来保存)
当系统或其他异常导致会话中断的时候我们只需从持久化取出cookie设置到httpClient即可继续访问服务器 httpClient = new DefaultHttpClient(connManager, params);
httpClient.setCookieStore(cookieStore);