android httpclient 管理cookie
16lz
2021-01-26
阅读更多 自带的CookieStore只能在内存里边管理cookie,但是有的时候需要把cookie保存到文件里边。
为了长久保存cookie,自定义了BasicCookieStore,当添加cookie的时候,都保存到数据库,初始化的时候再从数据里边恢复cookie。
1、自定义的CookieStore
2、数据库
3、把CookieStore设置到httpclient
为了长久保存cookie,自定义了BasicCookieStore,当添加cookie的时候,都保存到数据库,初始化的时候再从数据里边恢复cookie。
1、自定义的CookieStore
public class CustomCookieStore extends BasicCookieStore {public CustomCookieStore() {super();try {Listcookies = 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();}}@Overridepublic synchronized void addCookie(Cookie cookie) {super.addCookie(cookie);try {CookieDBManager.getInstance().saveCookie(cookie);} catch (Exception e) {e.printStackTrace();}}@Overridepublic synchronized void addCookies(Cookie[] cookies) {super.addCookies(cookies);try {CookieDBManager.getInstance().saveCookies(cookies);} catch (Exception e) {e.printStackTrace();}}@Overridepublic synchronized void clear() {super.clear();try {CookieDBManager.getInstance().clear();} catch (Exception e) {e.printStackTrace();}}@Overridepublic synchronized boolean clearExpired(Date date) {try {CookieDBManager.getInstance().clearExpired();} catch (Exception e) {e.printStackTrace();}return super.clearExpired(date);}@Overridepublic synchronized List getCookies() {return super.getCookies();}@Overridepublic 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);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(SQL_CAREATE_DB);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);db.execSQL(SQL_CAREATE_DB);}}public ListgetAllCookies() {List cookies = new ArrayList ();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 Timber日志打印
- Android(安卓)display架构分析四-msm_fb.c 函数和数据结构介绍
- Android(安卓)RILD运行机制详解
- 【Android(安卓)开发教程】创建数据库辅助类
- Android(安卓)Settings 系统设置中 PreferenceActivity点击Heade
- android sqlite3使用命令
- Android(安卓)开发之SQLite基础
- [Android(安卓)Training视频系列] 6.2 Saving Files(保存文件)
- Android数据库安全permission