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

相关推荐