xutils 2.x(2.6)中的session获得和cookieStore使用

xutils框架是如今使用比较广泛的android开源框架,我对其也情有独钟,对于框架模块,我想大家都很熟悉了,就不多说了。我今天主要主要说下xutils2.6中如何为http请求设置cookiesession,当时这个问题纠结了很久,试了多次,问了不少人,上网搜索,结果越来越模糊,最终通过认真阅读源代码,终于清楚如何使用了,现在和大家分享一下自己的心得,也希望大家对开源框架的学习要认真阅读源代码。

     不多说了,大家看示例。

     程序设计到​​三个类,

    1.MyApplication(扩展应用)定义保存的Cookie和会话的全局变量

    2.LoginActivity演示获得的cookiesession

    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 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
一个Android基于快速开发的一个框架 xUtils 它是在aFinal基础上进行重构和扩展的框架 相比aFinal有很大的改善 同时 如果如果你的应用是基于网络的 那么只要处理得当 它会让你彻底的摆脱各种工具类和重复代码的困扰 xUtils 包含了很多实用的android工具 xUtils 源于Afinal框架 对Afinal进行了大量重构 使得xUtils支持大文件上传 更全面的http请求协议支持 拥有更加灵活的ORM 更多的事件注解支持且不受混淆影响 xUtils的四大组件: 一 ViewUtils 你受够了重复冗长的findViewById了嘛 你受够了各种监听事件的绑定了嘛 在这里 你只需要一句注解 如@ViewInject @OnClick 就能轻松摆脱小白似的代码 大大的上了一个档次 二 HttpUtils 支持的HTTP七种请求方式 非常便捷的满足你的接口请求的需要 同时还支持大文件上传下载 以及同步异步请求 三 BitmapUtils 你的程序因OOM强制关闭过嘛 你在为加在网络图片头疼嘛 有了组件 你将永久摆脱前面的问题 四 DbUtils 简单易用又出色的ORM框架 真的是谁用谁知道 直接轻松存储各种对象到sqlite数据库 同时也能非常方便的进行各种条件查询 甚至分页查询 还有对表数据的更新删除等操作 真正的实现 一行代码就可以进行增删改查 并且可通过注解自定义表名 列名 外键 唯一性约束 NOT NULL约束 CHECK约束等 支持事务 摘自github ">一个Android基于快速开发的一个框架 xUtils 它是在aFinal基础上进行重构和扩展的框架 相比aFinal有很大的改善 同时 如果如果你的应用是基于网络的 那么只要处理得当 它会让你彻底的摆脱各种工具类和重复代码的困扰 [更多]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值