import android.content.Context;import android.content.SharedPreferences;import android.text.TextUtils;import android.util.Log;import java.io.*;import java.net.CookieStore;import java.net.HttpCookie;import java.net.URI;import java.net.URISyntaxException;import java.util.*;import java.util.concurrent.ConcurrentHashMap;/** * A persistent cookie store which implements the Apache HttpClient CookieStore interface. * Cookies are stored and will persist on the user's device between application sessions since they * are serialized and stored in SharedPreferences. Instances of this class are * designed to be used with AsyncHttpClient#setCookieStore, but can also be used with a * regular old apache HttpClient/HttpContext if you prefer. */public class PersistentCookieStore implements CookieStore {    private static final String LOG_TAG = "PersistentCookieStore";    private static final String COOKIE_PREFS = "CookiePrefsFile";    private static final String COOKIE_NAME_PREFIX = "cookie_";    private static HashMap> cookies;    private static SharedPreferences cookiePrefs;    /**     * Construct a persistent cookie store.     *     * @param context Context to attach cookie store to     */    public PersistentCookieStore(Context context) {        cookiePrefs = context.getSharedPreferences(COOKIE_PREFS, 0);        cookies = new HashMap>();        // Load any previously stored cookies into the store        Map prefsMap = cookiePrefs.getAll();        for(Map.Entry entry : prefsMap.entrySet()) {            if (((String)entry.getValue()) != null && !((String)entry.getValue()).startsWith(COOKIE_NAME_PREFIX)) {                String[] cookieNames = TextUtils.split((String)entry.getValue(), ",");                for (String name : cookieNames) {                    String encodedCookie = cookiePrefs.getString(COOKIE_NAME_PREFIX + name, null);                    if (encodedCookie != null) {                        HttpCookie decodedCookie = decodeCookie(encodedCookie);                        if (decodedCookie != null) {                            if(!cookies.containsKey(entry.getKey()))                                cookies.put(entry.getKey(), new ConcurrentHashMap());                            cookies.get(entry.getKey()).put(name, decodedCookie);                        }                    }                }            }        }    }    @Override    public void add(URI uri, HttpCookie cookie) {        // Save cookie into local store, or remove if expired        if (!cookie.hasExpired()) {            if(!cookies.containsKey(cookie.getDomain()))                cookies.put(cookie.getDomain(), new ConcurrentHashMap());            cookies.get(cookie.getDomain()).put(cookie.getName(), cookie);        } else {            if(cookies.containsKey(cookie.getDomain()))                cookies.get(cookie.getDomain()).remove(cookie.getDomain());        }        // Save cookie into persistent store        SharedPreferences.Editor prefsWriter = cookiePrefs.edit();        prefsWriter.putString(cookie.getDomain(), TextUtils.join(",", cookies.get(cookie.getDomain()).keySet()));        prefsWriter.putString(COOKIE_NAME_PREFIX + cookie.getName(), encodeCookie(new SerializableHttpCookie(cookie)));        prefsWriter.commit();    }    protected String getCookieToken(URI uri, HttpCookie cookie) {        return cookie.getName() + cookie.getDomain();    }    @Override    public List get(URI uri) {        ArrayList ret = new ArrayList();        for (String key:cookies.keySet()){            if (uri.getHost().contains(key)){                ret.addAll(cookies.get(key).values());            }        }        return ret;    }    @Override    public boolean removeAll() {        SharedPreferences.Editor prefsWriter = cookiePrefs.edit();        prefsWriter.clear();        prefsWriter.commit();        cookies.clear();        return true;    }    public static void removeCookie(){        SharedPreferences.Editor prefsWriter = cookiePrefs.edit();        prefsWriter.clear();        prefsWriter.commit();        cookies.clear();    }    @Override    public boolean remove(URI uri, HttpCookie cookie) {        String name = getCookieToken(uri, cookie);        if(cookies.containsKey(uri.getHost()) && cookies.get(uri.getHost()).containsKey(name)) {            cookies.get(uri.getHost()).remove(name);            SharedPreferences.Editor prefsWriter = cookiePrefs.edit();            if(cookiePrefs.contains(COOKIE_NAME_PREFIX + name)) {                prefsWriter.remove(COOKIE_NAME_PREFIX + name);            }            prefsWriter.putString(uri.getHost(), TextUtils.join(",", cookies.get(uri.getHost()).keySet()));            prefsWriter.commit();            return true;        } else {            return false;        }    }    @Override    public List getCookies() {        ArrayList ret = new ArrayList();        for (String key : cookies.keySet())            ret.addAll(cookies.get(key).values());        return ret;    }    @Override    public List getURIs() {        ArrayList ret = new ArrayList();        for (String key : cookies.keySet())            try {                ret.add(new URI(key));            } catch (URISyntaxException e) {                e.printStackTrace();            }        return ret;    }    /**     * Serializes Cookie object into String     *     * @param cookie cookie to be encoded, can be null     * @return cookie encoded as String     */    protected String encodeCookie(SerializableHttpCookie cookie) {        if (cookie == null)            return null;        ByteArrayOutputStream os = new ByteArrayOutputStream();        try {            ObjectOutputStream outputStream = new ObjectOutputStream(os);            outputStream.writeObject(cookie);        } catch (IOException e) {            Log.d(LOG_TAG, "IOException in encodeCookie", e);            return null;        }        return byteArrayToHexString(os.toByteArray());    }    /**     * Returns cookie decoded from cookie string     *     * @param cookieString string of cookie as returned from http request     * @return decoded cookie or null if exception occured     */    protected HttpCookie decodeCookie(String cookieString) {        byte[] bytes = hexStringToByteArray(cookieString);        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);        HttpCookie cookie = null;        try {            ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);            cookie = ((SerializableHttpCookie) objectInputStream.readObject()).getCookie();        } catch (IOException e) {            Log.d(LOG_TAG, "IOException in decodeCookie", e);        } catch (ClassNotFoundException e) {            Log.d(LOG_TAG, "ClassNotFoundException in decodeCookie", e);        }        return cookie;    }    /**     * Using some super basic byte array <-> hex conversions so we don't have to rely on any     * large Base64 libraries. Can be overridden if you like!     *     * @param bytes byte array to be converted     * @return string containing hex values     */    protected String byteArrayToHexString(byte[] bytes) {        StringBuilder sb = new StringBuilder(bytes.length * 2);        for (byte element : bytes) {            int v = element & 0xff;            if (v < 16) {                sb.append('0');            }            sb.append(Integer.toHexString(v));        }        return sb.toString().toUpperCase(Locale.US);    }    /**     * Converts hex values from strings to byte arra     *     * @param hexString string of hex-encoded values     * @return decoded byte array     */    protected byte[] hexStringToByteArray(String hexString) {        int len = hexString.length();        byte[] data = new byte[len / 2];        for (int i = 0; i < len; i += 2) {            data[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4) + Character.digit(hexString.charAt(i + 1), 16));        }        return data;    }}
import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;import java.net.HttpCookie;public class SerializableHttpCookie implements Serializable {    private static final long serialVersionUID = 6374381323722046732L;    private transient final HttpCookie cookie;    private transient HttpCookie clientCookie;    public SerializableHttpCookie(HttpCookie cookie) {        this.cookie = cookie;    }    public HttpCookie getCookie() {        HttpCookie bestCookie = cookie;        if (clientCookie != null) {            bestCookie = clientCookie;        }        return bestCookie;    }    private void writeObject(ObjectOutputStream out) throws IOException {        out.writeObject(cookie.getName());        out.writeObject(cookie.getValue());        out.writeObject(cookie.getComment());        out.writeObject(cookie.getCommentURL());        out.writeObject(cookie.getDomain());        out.writeLong(cookie.getMaxAge());        out.writeObject(cookie.getPath());        out.writeObject(cookie.getPortlist());        out.writeInt(cookie.getVersion());        out.writeBoolean(cookie.getSecure());        out.writeBoolean(cookie.getDiscard());    }    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {        String name = (String) in.readObject();        String value = (String) in.readObject();        clientCookie = new HttpCookie(name, value);        clientCookie.setComment((String) in.readObject());        clientCookie.setCommentURL((String) in.readObject());        clientCookie.setDomain((String) in.readObject());        clientCookie.setMaxAge(in.readLong());        clientCookie.setPath((String) in.readObject());        clientCookie.setPortlist((String) in.readObject());        clientCookie.setVersion(in.readInt());        clientCookie.setSecure(in.readBoolean());        clientCookie.setDiscard(in.readBoolean());    }}

在请求头的引用如下:

        CookieHandler cookieHandler = new CookieManager(new PersistentCookieStore(context), CookiePolicy.ACCEPT_ALL);        HttpLoggingInterceptor logging = new HttpLoggingInterceptor();        logging.setLevel(HttpLoggingInterceptor.Level.BODY);        OkHttpClient okHttpClient = new OkHttpClient.Builder()                .addInterceptor(logging)                .cookieJar(new JavaNetCookieJar(cookieHandler))                .build();        mRetrofit = new Retrofit.Builder()                .baseUrl(UrlConfig.IP)  //添加baseurl                .addConverterFactory(ScalarsConverterFactory.create()) //添加返回为字符串的支持                .addConverterFactory(GsonConverterFactory                        .create(new GsonBuilder()                                .setDateFormat("yyyy-MM-dd HH:mm").registerTypeAdapter(Timestamp.class, new TimeTypeAdapter())                                .create()))//create中可以传入其它json对象,默认Gson                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())// 相当于兼容RxJava、RxAndroid                .client(okHttpClient)                .build();

 

更多相关文章

  1. android GridView的应用举例
  2. 在Android工程中,添加ICON资源
  3. 在已有的Android(安卓)签名基础上添加地图key的方式
  4. JS、Android、IOS 批量生成国际化字符串工具
  5. Android(安卓):为你的启动页面SplashActivity 添加动画的几种方法
  6. 【Android(安卓)Training - 03】使用Fragments建立动态的UI [ Le
  7. Android(安卓)STB 编译自定义jar
  8. Android应用程序访问linux驱动第四步:实现android应用程序
  9. Launcher功能的修改及添加,本篇是一些小功能的展示,通知栏显隐,dock

随机推荐

  1. Android(安卓)XML pull解析
  2. android在Service,BroadCast onReceiver(
  3. Android(安卓)OTA升级详细流程分析(non-AB
  4. Android(安卓)中的建造者模式
  5. android mvn project
  6. android eclipse错误集合
  7. Android(安卓)camera HAL四个callback
  8. 获取android设备屏幕大小和密度
  9. 表格(gridview)
  10. Android-把Android(安卓)Studio改为Eclip