在移动开发中登入后常常碰到访问接口被弹回登入,或者提示从新登入问题,其缘由在于访问服务器的会话并不是一个。数据库
解决办法,使用同一个会话浏览器
//connManager, params分别是设置超时和初始化。服务器
DefaultHttpClient httpClient = new DefaultHttpClient(connManager, params); cookie
// 将uefEntity参数设置到post请求中post
httpPost.setEntity(uefEntity);ui
// 发送post请求,同时也将entity中的各参数发送过去,得到到响应对象spa
HttpResponse httpResponse = httpClient .execute(httpPost);
.net
若是这里不手动关闭 httpClient 或者不被系统回收,那么你就能够一直使用这个httpClient而不被服务器拦截。firefox
这里和网页访问服务器的原理基本一致,好比用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);