Okhttp cookie acquisition, persistent storage, and setting to webview (Tencent tbs browser)

Okhttp cookie acquisition, persistent storage, and setting to webview (Tencent tbs browser)

1. Okhttp gets cookies

In fact, okhttp provides the cookie management interface CookieJar. We only need to inherit CookieJar.
Every time okhttp initiates a request, it will be called: load the saveFromResponse method, put and return the cookie to us; every time the request returns, the loadForRequest method will be called. We will ourselves Just bring in the saved cookies;

	//保存cookie
	@Override
    public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
    
    
        if (cookies != null && cookies.size() > 0) {
    
            	 
          //保存cookie操作
        }
    }
    //加载cookie
    @Override
    public List<Cookie> loadForRequest(HttpUrl url) {
    
        	
        List<Cookie> cookies = cookieStore.get(url);
        return cookies;
    }

2. okhttp cookie storage persistence

Because okhttp only provides cookie processing methods and does not provide saving methods, you need to save it yourself.
Here we save it to the local memory of the mobile phone.
Here we directly post the saved PersistentCookieStore class.

public class PersistentCookieStore {
    
    
    private static final String LOG_TAG = "PersistentCookieStore";
    private static final String COOKIE_PREFS = "Cookies_Prefs";

    private final Map<String, ConcurrentMap<String, Cookie>> cookies;
    private final SharedPreferences cookiePrefs;

    public PersistentCookieStore(Context context) {
    
    
        cookiePrefs = context.getSharedPreferences(COOKIE_PREFS, 0);
        ConcurrentMap<String, Cookie> cmp=new ConcurrentHashMap<String, Cookie>();
        cookies = new HashMap<String, ConcurrentMap<String, Cookie>>();

        //将持久化的cookies缓存到内存中 即map cookies
        Map<String, ?> prefsMap = cookiePrefs.getAll();
        for (Map.Entry<String, ?> entry : prefsMap.entrySet()) {
    
    
            String[] cookieNames = TextUtils.split((String) entry.getValue(), ",");
            for (String name : cookieNames) {
    
    
                String encodedCookie = cookiePrefs.getString(name, null);
                if (encodedCookie != null) {
    
    
                    Cookie decodedCookie = decodeCookie(encodedCookie);
                    if (decodedCookie != null) {
    
    
                        if (!cookies.containsKey(entry.getKey())) {
    
    
                            cookies.put(entry.getKey(),
                                    new ConcurrentHashMap<String, Cookie>());
                        }
                        cookies.get(entry.getKey()).put(name, decodedCookie);
                    }
                }
            }
        }
    }

    protected String getCookieToken(Cookie cookie) {
    
    
        return cookie.name() + "@" + cookie.domain();
    }

    public void add(HttpUrl url, Cookie cookie) {
    
    
        String name = getCookieToken(cookie);

        //将cookies缓存到内存中 如果缓存过期 就重置此cookie
        //本来判断是否过期是用cookie.persistent()的,但是我怎么试都是过期的
        //不知道是我的原因还是哪里不对,所以自己写了判断
        if (!isCookieExpired(cookie)) {
    
    
            if (!cookies.containsKey(url.host())) {
    
    
                cookies.put(url.host(), new ConcurrentHashMap<String, Cookie>());
            }
            cookies.get(url.host()).put(name, cookie);
        } else {
    
    
            if (cookies.containsKey(url.host())) {
    
    
                cookies.get(url.host()).remove(name);
            }
        }

        if(cookies.get(url.host()).keySet()!=null)
        {
    
    
        	  //讲cookies持久化到本地
            SharedPreferences.Editor prefsWriter = cookiePrefs.edit();
            prefsWriter.putString(url.host(), TextUtils.join(",", cookies.get(url.host()).keySet()));
            prefsWriter.putString(name, encodeCookie(new SerializableOkHttpCookies(cookie)));
            prefsWriter.apply();
        }
      
    }

    /** 当前cookie是否过期 */
    private static boolean isCookieExpired(Cookie cookie) {
    
    
         return cookie.expiresAt() < System.currentTimeMillis();
    }
    //获取cookie
    public List<Cookie> get(HttpUrl url) {
    
    
        ArrayList<Cookie> ret = new ArrayList<Cookie>();
        if (cookies.containsKey(url.host()))
            ret.addAll(cookies.get(url.host()).values());
        return ret;
    }

	//移除全部
    public boolean removeAll() {
    
    
        SharedPreferences.Editor prefsWriter = cookiePrefs.edit();
        prefsWriter.clear();
        prefsWriter.apply();
        cookies.clear();
        return true;
    }
	//移除指定cookie
    public boolean remove(HttpUrl url, Cookie cookie) {
    
    
        String name = getCookieToken(cookie);

        if (cookies.containsKey(url.host()) && cookies.get(url.host()).containsKey(name)) {
    
    
            cookies.get(url.host()).remove(name);

            SharedPreferences.Editor prefsWriter = cookiePrefs.edit();
            if (cookiePrefs.contains(name)) {
    
    
                prefsWriter.remove(name);
            }
            prefsWriter.putString(url.host(), TextUtils.join(",", cookies.
                    get(url.host()).keySet()));
            prefsWriter.apply();
            return true;
        } else {
    
    
            return false;
        }
    }
	//获取全部
    public List<Cookie> getCookies() {
    
    
        ArrayList<Cookie> ret = new ArrayList<Cookie>();
        for (String key : cookies.keySet())
            ret.addAll(cookies.get(key).values());
        return ret;
    }

    /**
     * cookies 序列化成 string
     *
     * @param cookie 要序列化的cookie
     * @return 序列化之后的string
     */
    protected String encodeCookie(SerializableOkHttpCookies 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());
    }

    /**
     * 将字符串反序列化成cookies
     *
     * @param cookieString cookies string
     * @return cookie object
     */
    protected Cookie decodeCookie(String cookieString) {
    
    
        byte[] bytes = hexStringToByteArray(cookieString);
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
        Cookie cookie = null;
        try {
    
    
            ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
            cookie = ((SerializableOkHttpCookies) objectInputStream.readObject()).getCookies();
        } catch (IOException e) {
    
    
            Log.d(LOG_TAG, "IOException in decodeCookie", e);
        } catch (ClassNotFoundException e) {
    
    
            Log.d(LOG_TAG, "ClassNotFoundException in decodeCookie", e);
        }
        return cookie;
    }

    /**
     * 二进制数组转十六进制字符串
     *
     * @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);
    }

    /**
     * 十六进制字符串转二进制数组
     *
     * @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;
    }
}

おすすめ

転載: blog.csdn.net/qq_38881740/article/details/118024327