關(guān)于Android?Webview?設(shè)置Cookie問(wèn)題詳解
最近遇到一個(gè)比較坑爹的問(wèn)題就是webview里添加第三方H5頁(yè)面,但是數(shù)據(jù)獲取不到,經(jīng)過(guò)一天的折磨發(fā)現(xiàn)cookie值每次都會(huì)變,再根據(jù)谷歌開(kāi)發(fā)者模式定位,cookie每次應(yīng)該都是固定,每次變化說(shuō)明本地的cookie有問(wèn)題,或者為空。
webview有一個(gè)CookieManager這個(gè)類(lèi),他是專(zhuān)門(mén)管理cookie的,這個(gè)類(lèi)可以設(shè)置一個(gè)或多個(gè)cookie,而且當(dāng)你在里面設(shè)置好cookie以后接口會(huì)自動(dòng)根據(jù)你設(shè)置時(shí)的url來(lái)使用。
一共有兩種獲取cookie的方法一種是HttpURLConnection獲取,一種是直接利用CookieManager獲取。
第一種根據(jù)url利用HttpURLConnection獲取接口中的cookie()
/** * 獲取接口中的cookie * @param loginUrl */ private void syncCookie(final String loginUrl) { try { StringBuilder builder = new StringBuilder(); URL url = null; byte[] data = builder.toString().getBytes("UTF-8"); url = new URL(loginUrl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); connection.setRequestProperty("Content-Length", Integer.toString(data.length)); connection.setInstanceFollowRedirects(false); connection.setRequestMethod("GET"); OutputStream os = connection.getOutputStream(); os.write(data); os.close(); int aRstCode = connection.getResponseCode(); if (aRstCode == HttpURLConnection.HTTP_OK) { cookie = connection.getHeaderField("Set-Cookie"); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
第二種直接利用CookieManager獲取
cookieManager.getCookie(url);
這兩種返回的cookie是有一些區(qū)別的,看你需要哪一種。
設(shè)置cookie 允許它跨域
CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptCookie(true); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { cookieManager.setAcceptThirdPartyCookies(mWebView, true);//TODO 跨域cookie讀取 Log.d(TAG,"跨域cookie讀取"); }
把cookie設(shè)置道webview里
/** *@param cookie 上面獲取到的存儲(chǔ)在本地的cookie字符串 *@param url 要加載的頁(yè)面url */ @SuppressLint("NewApi") private void setCookie(String cookie, String url) { String StringCookie = cookie; CookieSyncManager.createInstance(this); if (cookieManager == null) { cookieManager = CookieManager.getInstance(); } cookieManager.setAcceptFileSchemeCookies(true); cookieManager.setAcceptCookie(true); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {//這個(gè)代碼是清楚webview里的所有cookie加不加完全看你自己。 cookieManager.removeSessionCookies(null); cookieManager.flush(); } else { cookieManager.removeAllCookie(); CookieSyncManager.getInstance().sync(); } runOnUiThread(new Runnable() { @Override public void run() { cookieManager.setCookie(url, StringCookie, new ValueCallback<Boolean>() { @Override public void onReceiveValue(Boolean aBoolean) { Log.d(TAG,"setCookie() aBoolean:"+aBoolean); } }); } }); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { cookieManager.flush(); } else { CookieSyncManager.getInstance().sync(); } }
注意 注意 注意:重要的事情說(shuō)三遍
有些機(jī)型只支持單獨(dú)設(shè)置cookie就比如(瞎寫(xiě)的)
session=jashdkjashdkashdk;path=path
如果你直接把這一整串setCookie進(jìn)入,是設(shè)置不進(jìn)去的,你需要把他們根據(jù)分號(hào)切割開(kāi),一個(gè)一個(gè)的給它們?cè)O(shè)置進(jìn)去。像這種cookieManager.setCookie(url,“session=jashdkjashdkashdk”)(如果你直接設(shè)置進(jìn)去,并且成功了就當(dāng)我后面說(shuō)的是廢話)
到此這篇關(guān)于關(guān)于Android Webview 設(shè)置Cookie問(wèn)題詳解的文章就介紹到這了,更多相關(guān)Android Webview 置Cookie問(wèn)題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android實(shí)現(xiàn)可折疊式標(biāo)題欄
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)可折疊式標(biāo)題欄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09Android仿簡(jiǎn)書(shū)動(dòng)態(tài)searchview搜索欄效果
這篇文章主要為大家詳細(xì)介紹了Android仿簡(jiǎn)書(shū)動(dòng)態(tài)searchview效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06Android開(kāi)發(fā)中LayoutInflater用法詳解
這篇文章主要介紹了Android開(kāi)發(fā)中LayoutInflater用法,結(jié)合實(shí)例形式分析了LayoutInflater類(lèi)的功能、作用、使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-08-08Android編程實(shí)現(xiàn)的自定義彈窗(PopupWindow)功能示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)的自定義彈窗(PopupWindow)功能,結(jié)合簡(jiǎn)單實(shí)例形式分析了Android自定義彈窗實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-03-03Android編程實(shí)現(xiàn)自定義ProgressBar樣式示例(背景色及一級(jí)、二級(jí)進(jìn)度條顏色)
這篇文章主要介紹了Android編程實(shí)現(xiàn)自定義ProgressBar樣式功能,涉及針對(duì)背景色及一級(jí)、二級(jí)進(jìn)度條顏色的操作技巧,需要的朋友可以參考下2017-01-01Android Drawable及其相關(guān)類(lèi)的使用
本文主要講解Android Drawable,這里整理了Drawable 的文檔資料和實(shí)例代碼以及實(shí)現(xiàn)效果圖,有需要的小伙伴可以參考下2016-08-08Kotlin 匿名類(lèi)實(shí)現(xiàn)接口和抽象類(lèi)的區(qū)別詳解
這篇文章主要介紹了Kotlin 匿名類(lèi)實(shí)現(xiàn)接口和抽象類(lèi)的區(qū)別詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03Android Studio中引入Lambda表達(dá)式的方法
這篇文章主要給大家介紹了在Android Studio中引入Lambda表達(dá)式的方法,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-03-03