欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

android httpclient 管理cookie

程序员文章站 2022-07-14 17:49:39
...
自带的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());