`
bwlcool
  • 浏览: 19747 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android httpclient 管理cookie

阅读更多
自带的CookieStore只能在内存里边管理cookie,但是有的时候需要把cookie保存到文件里边。

为了长久保存cookie,自定义了BasicCookieStore,当添加cookie的时候,都保存到数据库,初始化的时候再从数据里边恢复cookie。

1、自定义的CookieStore

public class CustomCookieStore extends BasicCookieStore {

	public CustomCookieStore() {
		super();
		try {
			List<Cookie> cookies = CookieDBManager.getInstance().getAllCookies();
			CookieDBManager.getInstance().clear();
			Cookie[] cookiesArr = new Cookie[cookies.size()];
			for (int i = cookies.size() - 1; i >= 0; i--) {
				cookiesArr[i] = cookies.get(i);
			}
			addCookies(cookiesArr);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public synchronized void addCookie(Cookie cookie) {
		super.addCookie(cookie);
		try {
			CookieDBManager.getInstance().saveCookie(cookie);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public synchronized void addCookies(Cookie[] cookies) {
		super.addCookies(cookies);
		try {
			CookieDBManager.getInstance().saveCookies(cookies);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public synchronized void clear() {
		super.clear();
		try {
			CookieDBManager.getInstance().clear();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public synchronized boolean clearExpired(Date date) {
		try {
			CookieDBManager.getInstance().clearExpired();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return super.clearExpired(date);
	}

	@Override
	public synchronized List<Cookie> getCookies() {
		return super.getCookies();
	}

	@Override
	public String toString() {
		return super.toString();
	}

}



2、数据库

public class CookieDBManager {

	private final String DB_NAME = "cookie.db";
	private final String TABLE_NAME = "cookie";

	private DBHelper dbHelper;
	private SQLiteDatabase db;

	private static CookieDBManager instance;

	public static CookieDBManager getInstance() {
		if (instance == null) {
			instance = new CookieDBManager();
		}
		return instance;
	}

	public CookieDBManager() {
		dbHelper = new DBHelper(App.getCurrentApp(), DB_NAME, null, 1);
		db = dbHelper.getWritableDatabase();
	}

	private class DBHelper extends SQLiteOpenHelper {

		private String SQL_CAREATE_DB = "CREATE TABLE IF NOT EXISTS "//
				+ TABLE_NAME + " (" + //
				Column.AUTO_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + //
				Column.VALUE + " TEXT," + //
				Column.NAME + " TEXT," + //
				Column.COMMENT + " TEXT," + //
				Column.DOMAIN + " TEXT," + //
				Column.EXPIRY_DATE + " INTEGER," + //
				Column.PATH + " TEXT," + //
				Column.SECURE + " INTEGER," + //
				Column.VERSION + " TEXT)";//

		public DBHelper(Context context, String name, CursorFactory factory,
				int version) {
			super(context, name, factory, version);
		}

		@Override
		public void onCreate(SQLiteDatabase db) {
			db.execSQL(SQL_CAREATE_DB);
		}

		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
			db.execSQL(SQL_CAREATE_DB);
		}

	}

	public List<Cookie> getAllCookies() {
		List<Cookie> cookies = new ArrayList<Cookie>();

		Cursor cursor = db
				.query(TABLE_NAME, null, null, null, null, null, null);

		for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
			String name = cursor.getString(cursor.getColumnIndex(Column.NAME));
			String value = cursor
					.getString(cursor.getColumnIndex(Column.VALUE));

			BasicClientCookie cookie = new BasicClientCookie(name, value);

			cookie.setComment(cursor.getString(cursor
					.getColumnIndex(Column.COMMENT)));
			cookie.setDomain(cursor.getString(cursor
					.getColumnIndex(Column.DOMAIN)));
			long expireTime = cursor.getLong(cursor
					.getColumnIndex(Column.EXPIRY_DATE));
			if (expireTime != 0) {
				cookie.setExpiryDate(new Date(expireTime));
			}
			cookie.setPath(cursor.getString(cursor.getColumnIndex(Column.PATH)));
			cookie.setSecure(cursor.getInt(cursor.getColumnIndex(Column.SECURE)) == 1);
			cookie.setVersion(cursor.getInt(cursor
					.getColumnIndex(Column.VERSION)));

			cookies.add(cookie);
		}

		cursor.close();

		return cookies;
	}

	public void saveCookie(Cookie cookie) {
		LogUtil.d("saveCookie:" + cookie);
		if (cookie == null) {
			return;
		}
		db.delete(TABLE_NAME, Column.NAME + " = ? ",
				new String[] { cookie.getName() });
		ContentValues values = new ContentValues();
		values.put(Column.VALUE, cookie.getValue());
		values.put(Column.NAME, cookie.getName());
		values.put(Column.COMMENT, cookie.getComment());
		values.put(Column.DOMAIN, cookie.getDomain());
		if (cookie.getExpiryDate() != null) {
			values.put(Column.EXPIRY_DATE, cookie.getExpiryDate().getTime());
		}
		values.put(Column.PATH, cookie.getPath());
		values.put(Column.SECURE, cookie.isSecure() ? 1 : 0);
		values.put(Column.VERSION, cookie.getVersion());

		db.insert(TABLE_NAME, null, values);
	}

	public void saveCookies(Cookie[] cookies) {
		LogUtil.d("saveCookies:" + cookies);
		if (cookies == null) {
			return;
		}

		db.beginTransaction();

		for (Cookie cookie : cookies) {
			saveCookie(cookie);
		}

		db.setTransactionSuccessful();
		db.endTransaction();
	}

	public void clear() {
		db.delete(TABLE_NAME, null, null);
	}

	public void clearExpired() {
		long time = System.currentTimeMillis();
		db.delete(TABLE_NAME, "EXPIRY_DATE < ? AND EXPIRY_DATE != 0",
				new String[] { String.valueOf(time) });
	}

	private static class Column {
		public static final String AUTO_ID = "AUTO_ID";
		public static final String VALUE = "VALUE";
		public static final String NAME = "NAME";
		public static final String COMMENT = "COMMENT";
		public static final String DOMAIN = "DOMAIN";
		public static final String EXPIRY_DATE = "EXPIRY_DATE";
		public static final String PATH = "PATH";
		public static final String SECURE = "SECURE";
		public static final String VERSION = "VERSION";
	}
}



3、把CookieStore设置到httpclient

httpClient.setCookieStore(new CustomCookieStore());




分享到:
评论

相关推荐

    AndroidHttpClient使用Cookie应用分析

    今天想把一个用使用了HttpClient的自动签到小程序移植到Android上,还好Android的SDK自带了HttpClient的包.当然也可以继续使用DefaultHttpClient,但用为Android定制的AndroidHttpClient自然更好

    Android使用AsyncHttpClient读写Cookie

    Android中使用AsyncHttpClient读写Cookie实例,方便快捷!

    android cookie获取和设置,webView的cookie的同步

    httpClient请求和服务器session保持同步,webView对cookie的管理

    安卓使用httpClient实现网络请求并通过cookie维持对话

    该资源为安卓使用httpClient实现网络请求并通过cookie维持对话,代码中大家换上自己的接口,就可以运行。

    android读写cookie的方法示例

    做了一个android网络应用,要求用自己实现的webview去访问web网站,并且在远程登录成功之后把cookie写入到手机,保留用作以后的自动登录。找了好多资料。发觉读取cookies倒还用的很普遍,可是通过程序写cookie却没有...

    Android 登录Web 时对cookie 处理

    httpclient相当强大,读写cookie非常容易: CookieStore cookies=((AbstractHttpClient)client).getCookieStore();//读cookie ((AbstractHttpClient) client).setCookieStore(cookies);//写cookie 另外的一个问题...

    Android持久化保存cookie的方法

    主要介绍了Android持久化保存cookie的方法,在解析网页信息的时候,需要登录后才能访问,所以使用httpclient模拟登录,然后把cookie保存下来,以供下一次访问使用,感兴趣的小伙伴们可以参考一下

    纯JSP演示Cookie自动登录(完整工程)

    纯JSP演示Cookie自动登录(完整工程。主要实现勾选自动登录后, 哪怕服务器重启后session丢失,靠客户端COOKIE仍然正常登录并刷新COOKIE。...现为WEB,可改造为提供android 和ios下的httpclient保持长久登录状态的方式。

    android-async-http 源码

    An asynchronous, callback-based Http client for Android built on top of Apache's HttpClient libraries. Changelog See what is new in version 1.4.9 released on 19th September 2015 ...

    Android登录注册(客户端)_cookieMonster

    这是一个Android Studio工程,包含登录和注册两个Activity,分别使用PostService类指定连接的Java Web服务器的Servlet,HttpClient类指定连接的服务器地址。详情可参考我的博客文章...

    android-connection-handler:Android库,用于处理与RESTful服务的通信

    ConnectionHandler是一个开放源代码Android库项目,用于处理与RESTful服务的通信。 它基于Apache HttpClient。 ConnectionHandler的优点: 支持同步和异步调用。 支持许多配置选项,例如连接超时,使用cookie等。...

    Android平台下轻量级http网络传输库

    AsyncHttpHelp是一个android平台下基于httpclient开发的HTTP网络请求工具。 优点 功能齐全,提供常用的http网络访问接口。 轻量级,无任何第三方库依赖,库大小为90K左右。 定制化,自定义json解析库,支持请求...

    android好用的框架(封装了数据库,注解,网络,图片缓存的框架)

    public HttpClient getHttpClient() public HttpContext getHttpContext() public void configCookieStore(CookieStore cookieStore) //配置cookie public void configUserAgent(String userAgent) public ...

    xUtils 3.2

    支持标准的Cookie策略, 区分domain, path... 事件注解去除不常用的功能, 提高性能. 数据库api简化提高性能, 达到和greenDao一致的性能. 图片绑定支持gif, webp; 支持圆角, 圆形, 方形等裁剪, 支持自动旋转...

    VolleyCookie:使用截击保存 cookie 的示例

    排球曲奇使用截击保存 cookie 的示例1 - 将volley.jar从 libs 路径导入到您的项目2 - 在 build.gradle 依赖项中导入compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.3' 3...

    xUtils3-3.2.2

    支持标准的Cookie策略, 区分domain, path... 事件注解去除不常用的功能, 提高性能. 数据库api简化提高性能, 达到和greenDao一致的性能. 图片绑定支持gif, webp; 支持圆角, 圆形, 方形等裁剪, 支持自动旋转...

    xUtils3.jar最火的网络框架

    支持标准的Cookie策略, 区分domain, path; 事件注解去除不常用的功能, 提高性能; 数据库api简化提高性能, 达到和greenDao一致的性能; 图片绑定支持gif(受系统兼容性影响, 部分gif文件只能静态显示), webp; 支持...

Global site tag (gtag.js) - Google Analytics