当前位置: 代码迷 >> Android >> android httpclient 治理cookie
  详细解决方案

android httpclient 治理cookie

热度:71   发布时间:2016-05-01 10:30:52.0
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().getDate());		}		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());