xutils框架是如今使用比较广泛的android开源框架,我对其也情有独钟,对于框架模块,我想大家都很熟悉了,就不多说了。我今天主要主要说下xutils2.6中如何为http请求设置cookie和session,当时这个问题纠结了很久,试了多次,问了不少人,上网搜索,结果越来越模糊,最终通过认真阅读源代码,终于清楚如何使用了,现在和大家分享一下自己的心得,也希望大家对开源框架的学习要认真阅读源代码。
不多说了,大家看示例。
程序设计到三个类,
1.MyApplication(扩展应用)定义保存的Cookie和会话的全局变量
2.LoginActivity演示获得的cookie和session
3.GetDataActivity演示设置的cookie和session
import com.lidroid.xutils.util.PreferencesCookieStore;
import android.app.Application;
public class MyApplication extends Application{
/**
* 用PreferencesCookieStore 持久化cookie到本地
* 类的定义:public class PreferencesCookieStore implements CookieStore
* 其内部用SharedPreferences保存,操作内部已封装
* 位置:com.lidroid.xutils.util.PreferencesCookieStore;
*
* 特别注意:PreferencesCookieStore 这个类在xutils 2.6中才出现,以前的版本没有
* xutils 3.x 版本中也没有这个类
* 在xutils 2.6 以前版本要么自己参照PreferencesCookieStore源码,保存cookie到本地
* 或者自己用SharedPreferences保存sessionid 到本地,sessionid就是一个字符串,用
* SharedPreferences保存很简单,就不介绍了
*
* 注:sessionid 实际是保存在cookie中
* 向服务器可以提交cookie 或 sessionid
* 提交cookie :调用方法 public HttpUtils configCookieStore(CookieStore cookieStore);
* 提交sessionid : RequestParams public void addHeader(String name, String value);
* 或setHeader(String name, String value);
*/
public static PreferencesCookieStore presCookieStore;
public static String jsessionid = ""; //保存sessionid
public void onCreate() {
/*
* 程序启动,调用这个构造函数
* 在构造函数中 PreferencesCookieStore内部从本地
* 取出cookie,保存在PreferencesCookieStore 中的队列中
* 如果本地没有,PreferencesCookieStore public List<Cookie> getCookies();
* 返回的 List<Cookie> 长度为0
*
*/
presCookieStore = new PreferencesCookieStore(getApplicationContext());
}
}
import java.util.List;
import org.apache.http.client.CookieStore;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.DefaultHttpClient;
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.RequestParams;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import com.lidroid.xutils.http.client.HttpRequest.HttpMethod;
public class LoginActivity {
/**
* 登陆 后获得cookie sessionid
* 这儿只是演示如何获得cookie和seesionid
* 因此 url,RequestParams 直接用null,大家注意
*
*/
public void login(){
final HttpUtils http = new HttpUtils();
String url = null;
RequestParams params = null;
http.send(HttpMethod.POST, url,params, new RequestCallBack<String>() {
@Override
public void onFailure(HttpException arg0, String arg1) {
}
@Override
public void onSuccess(ResponseInfo<String> arg0) {
/*
* 得到cookie seesionid 并持久化到本地的核心代码
*/
DefaultHttpClient defaultHttpClient = (DefaultHttpClient) http.getHttpClient();
CookieStore cookieStore = defaultHttpClient.getCookieStore();
List<Cookie> cookies = cookieStore.getCookies();
for (Cookie cookie : cookies) {
if ("JSESSIONID".equals(cookie.getName())) {
MyApplication.jsessionid = cookie.getValue(); //得到sessionid
}
MyApplication.presCookieStore.addCookie(cookie); //将cookie保存在本地
}
}
});
}
}
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.RequestParams;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import com.lidroid.xutils.http.client.HttpRequest.HttpMethod;
/**
* 从服务器获取数据前 添加cookie
* 或sessionid
*
* @author Administrator
*
*/
public class GetDataActivity {
public void getData() {
final HttpUtils http = new HttpUtils();
String url = null;
/*
* get无参请求添加cookie
* get 含参请求可以添加cookie或session
* post请求可以添加cookie或session
*/
http.configCookieStore(MyApplication.presCookieStore);
http.send(HttpMethod.GET, url, new RequestCallBack<String>() {
@Override
public void onFailure(HttpException arg0, String arg1) {}
@Override
public void onSuccess(ResponseInfo<String> arg0) {}
});
/*
* seesionid字段在不同服务器开发语言中不同
* java中“JSESSIONID”,php中“PSESSIONID” 其他请自己查阅资料
* 这儿用java示例
*
* setHeader 和addHeader的区别:
* setHeader 未设置时,添加;已设置,重新赋值
* addHeader 未设置时,添加;已设置,仍保持以前的值不变
*/
RequestParams params = new RequestParams();
params.setHeader("Cookie", "JSESSIONID="+MyApplication.jsessionid); //设置头信息
http.send(HttpMethod.GET, url, new RequestCallBack<String>() {
@Override
public void onFailure(HttpException arg0, String arg1) {}
@Override
public void onSuccess(ResponseInfo<String> arg0) {}
});
}
}
如果存在不足,请大家多多指教,共同进步!
参考Xutils2.6源代码
1.HttpUtils
package com.lidroid.xutils;
import android.text.TextUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.*;
import com.lidroid.xutils.http.callback.HttpRedirectHandler;
import com.lidroid.xutils.http.callback.RequestCallBack;
import com.lidroid.xutils.http.client.DefaultSSLSocketFactory;
import com.lidroid.xutils.http.client.HttpRequest;
import com.lidroid.xutils.http.client.RetryHandler;
import com.lidroid.xutils.http.client.entity.GZipDecompressingEntity;
import com.lidroid.xutils.task.PriorityExecutor;
import com.lidroid.xutils.util.OtherUtils;
import org.apache.http.*;
import org.apache.http.client.CookieStore;
import org.apache.http.client.HttpClient;
import org.apache.http.client.protocol.ClientContext;
import org.apache.http.conn.params.ConnManagerParams;
import org.apache.http.conn.params.ConnPerRouteBean;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import