httpClient保持长会话

在移动开发中登入后经常碰到访问接口被弹回登入,或者提示重新登入问题,其原因在于访问服务器的会话并非一个。

解决办法,使用同一个会话

//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);




你可能感兴趣的:(后台,httpClient保持会话,cookie持久化)