Android中的webview相當(dāng)于在App中新開了一個(gè)瀏覽器客戶端洋腮,所以cookie不會(huì)和App的普通網(wǎng)絡(luò)請(qǐng)求同步延届,需要我們手動(dòng)吧cookie設(shè)置到webview中(如果需要用到cookie的話)
首先我們要從App的普通請(qǐng)求的返回中獲取cookie:
不同的請(qǐng)求方式取cookie的方式可能有所不同,項(xiàng)目中以volley為例:
在volley請(qǐng)求中一般需要定義一個(gè)Request對(duì)象繼承自com.android.volley.Request
其中需要覆寫多個(gè)方法瘪松,包括com.zhaosha.zsnetservice.util.CookiePostRequest#parseNetworkResponse
這個(gè)方法返回一個(gè)NetworkResponse對(duì)象,我們需要從這個(gè)對(duì)象中取出cookie保存到sp或者文件中
//首先拿到response.data,和header
String jsonString =
new String(response.data, HttpHeaderParser.parseCharset(response.headers));
mHeader = response.headers.toString();
Log.w("LOG", "get headers in parseNetworkResponse " + response.headers.toString());
//使用正則表達(dá)式從reponse的頭中提取cookie內(nèi)容的子串
Pattern pattern = Pattern.compile("Set-Cookie.*?;");
Matcher m = pattern.matcher(mHeader);
if (m.find()) {
cookieFromResponse = m.group();
cookieFromResponse = cookieFromResponse.substring(11, cookieFromResponse.length() - 1);
if(cookieFromResponse.contains("COOKIE_ID_HERE")){//如果包含自己設(shè)定cookie_ID就保存
//保存Cookie谜洽,保存到sp或者文件都可以,自己實(shí)現(xiàn)
saveCookie(context,cookieFromResponse);
}
}
//將cookie字符串添加到j(luò)sonObject中吴叶,該jsonObject會(huì)被deliverResponse遞交阐虚,調(diào)用請(qǐng)求時(shí)則能在onResponse中得到
JSONObject jsonObject = new JSONObject(jsonString);
return Response.success(jsonObject,HttpHeaderParser.parseCacheHeaders(response));
然后在需要用到cookie的webview中把保存的cookie同步
一般是在設(shè)置的WebviewClient中覆寫shouldInterceptRequest方法,這個(gè)方法會(huì)在webview加載url之前調(diào)用之前調(diào)用
//獲取cookie蚌卤,自己實(shí)現(xiàn)
String cookie= getCookie(this);
if(Build.VERSION.SDK_INT< Build.VERSION_CODES.LOLLIPOP) {
CookieSyncManager.createInstance(this);
}
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeAllCookie();
if(!cookieManager.hasCookies()){
cookieManager.setCookie(url,cookie);//如果沒有特殊需求实束,這里只需要將session id以"key=value"形式作為cookie即可
}
這樣webview就會(huì)用新的sessionid和服務(wù)器進(jìn)行通信了,