`
bwlcool
  • 浏览: 20479 次
  • 性别: 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());




分享到:
评论

相关推荐

    android httpClient所需jar包

    1. **commons-httpclient-3.1.jar**: 这是Apache HttpClient的一个旧版本,它提供了全面的HTTP客户端功能,包括支持HTTP/1.0和HTTP/1.1协议,支持各种HTTP方法如GET、POST等,以及处理重定向、Cookie管理和认证等...

    Android HttpClient源码

    HttpClient提供了一套完整的机制,可以设置请求头、处理Cookie、管理连接池,这在爬虫开发中非常有用。 在使用HttpClient时,有几个关键概念需要理解: 1. **HttpParams**: 这是用来设置HttpClient参数的对象,如...

    Android HttpClient Network Lib

    使用HttpClient的优点在于它提供了丰富的功能,如连接管理、重试策略和身份验证机制,使得网络编程更加便捷。 在Android中集成HttpClient,首先需要在`build.gradle`文件中添加依赖(对于API 23及以上,由于...

    AndroidHttpClient详解及调用示例

    AndroidHttpClient在原生的HttpClient基础上进行了优化,更适合Android环境的性能和内存管理。 ### AndroidHttpClient的创建与配置 创建AndroidHttpClient对象非常简单,只需调用`AndroidHttpClient.newInstance...

    Android_HttpClient_jar包+HttpClientJarAndSource

    在Android系统中,HttpClient提供了一套完整的API,使得开发者能够方便地进行HTTP请求,发送POST、GET等方法,处理响应数据,以及实现Cookie管理、重定向等功能。 二、HttpClient在Android中的应用 1. 发起HTTP...

    HttpClient for android 4 3 5 jar

    7. **Cookie管理**:能够处理服务器返回的cookies并将其保存,用于后续请求。 在Android中使用HttpClient时,需要注意以下几点: 1. **兼容性问题**:自Android 6.0(API级别23)开始,HttpClient被标记为废弃,...

    Android httpclient httpmine4j

    然而,Android原生的HttpClient并不支持Multipart/form-data类型的请求,这在上传文件时是个问题。为了解决这个问题,我们可以引入第三方库如`httpclient`和`httpmime`,特别是`httpmine4j`相关的组件。 `...

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

    在 Android 开发中,Cookie 的管理和同步对于维护用户会话状态至关重要。特别是在使用 HttpClient 发起网络请求时,保持客户端与服务器端 Session 的一致性是非常重要的。此外,在 WebView 中进行 Cookie 的同步也是...

    httpclient-3.1

    《HttpClient 3.1在Android开发中的应用及详解》 HttpClient是Apache软件基金会的一个开源项目,提供了强大的HTTP客户端实现,广泛应用于Java平台的网络通信。本文主要围绕"HttpClient 3.1"版本,探讨其在Android...

    android和httpclient结合的例子

    它提供了丰富的API来处理各种HTTP操作,如GET、POST、PUT等,以及设置请求头、处理Cookie、管理连接池等功能。 在Android中使用HttpClient,首先需要添加相应的依赖。由于Android API 23及更高版本中移除了...

    httpclient

    HttpClient是用于Android开发中进行网络通信的一个重要的库,它允许应用程序...通过以上的知识点介绍,可以对HttpClient有一个全面的了解,并在实际开发过程中有效地使用HttpClient进行Android应用与服务器之间的通信。

    httpclient-4.3.6.jar包,安卓异步框架必备

    除了基本的HTTP请求,HttpClient还支持Cookie管理、身份验证、代理设置等高级功能。例如,使用`CookieStore`可以方便地管理会话cookie,而`AuthCache`则有助于处理服务器的身份验证需求。 在实际应用中,HttpClient...

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

    6. **Cookie管理** 当涉及到维持会话时,我们需要处理Cookie。HttpClient提供CookieStore来存储服务器返回的Cookie: ```java CookieStore cookieStore = new BasicCookieStore(); httpClient.setCookieStore...

    httpclient-4.5.5

    1. **全面的 HTTP 协议支持**:HttpClient 支持 HTTP/1.1 和部分 HTTP/2 规范,包括 GET、POST、PUT、DELETE 等多种请求方法,以及 Cookie、重定向、身份验证等高级特性。 2. **高性能与可扩展性**:HttpClient ...

    android AppWidgetProvider httpclient 扒取网页

    HttpClient提供了对HTTPS的支持,能够处理Cookie,支持自定义HTTP头,以及重试和连接管理等功能,使得网络通信更加灵活和可控。 `webview`虽然在标签中提及,但在这个描述里似乎并未直接使用。通常,WebView是...

    Android Async-HttpClient

    - **支持Cookie**:管理Cookie,维持用户会话。 - **自定义请求头**:方便地添加自定义请求头,以满足特定需求。 - **多格式支持**:可以处理JSON、XML等多种数据格式。 在实际开发中,开发者可以根据项目需求对...

    HttpClient

    - HttpClient支持Cookie管理,通过`CookieStore`和`BasicCookieStore`类可以保存和读取Cookie。 - 设置Cookie策略:`CookieSpecRegistry cookieSpecRegistry = new CookieSpecRegistry();` 和 `cookieSpecRegistry...

    最新android4 HTTPCLIENT4JAR包

    3. **支持HTTP协议**:除了基本的HTTP/1.1协议,HTTPCLIENT4还支持诸如PUT、DELETE、HEAD等HTTP方法,以及Cookie管理、代理设置、重定向处理等功能。 4. **流式处理**:正如描述中提到,HTTPCLIENT4允许开发者将...

Global site tag (gtag.js) - Google Analytics