關(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è)類,他是專門管理cookie的,這個(gè)類可以設(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就比如(瞎寫的)
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 ListView實(shí)現(xiàn)無(wú)限循環(huán)滾動(dòng)
這篇文章主要為大家詳細(xì)介紹了Android ListView實(shí)現(xiàn)無(wú)限循環(huán)滾動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06
Android編程監(jiān)聽(tīng)APK安裝與刪除等過(guò)程的方法
這篇文章主要介紹了Android編程監(jiān)聽(tīng)APK安裝與刪除等過(guò)程的方法,涉及Android事件監(jiān)聽(tīng)、權(quán)限控制、廣播操作等相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-10-10
Android使用ViewDragHelper實(shí)現(xiàn)QQ6.X最新版本側(cè)滑界面效果實(shí)例代碼
這篇文章主要介紹了Android程序開(kāi)發(fā)實(shí)現(xiàn)QQ6.X最新版本側(cè)滑界面效果實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-02-02
iOS開(kāi)發(fā)中TableView類似QQ分組的折疊與展開(kāi)效果
這篇文章主要介紹了iOS開(kāi)發(fā)中TableView類似QQ分組的折疊與展開(kāi)效果,其實(shí)要做這個(gè)效果我先想到的是在tableView中再嵌套多個(gè)tableView。下面通過(guò)本文給大家分享實(shí)現(xiàn)思路,需要的朋友可以參考下2016-12-12
Android開(kāi)發(fā)從相冊(cè)中選取照片的示例代碼
這篇文章主要介紹了Android開(kāi)發(fā)從相冊(cè)中選取照片的示例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-09-09
Android自定義view實(shí)現(xiàn)阻尼效果的加載動(dòng)畫
這篇文章主要介紹了Android自定義view實(shí)現(xiàn)阻尼效果的加載動(dòng)畫的相關(guān)資料,非常不錯(cuò),具有一定的參考借鑒加載,需要的朋友可以參考下2016-11-11
Android TV開(kāi)發(fā):實(shí)現(xiàn)3D仿Gallery效果的實(shí)例代碼
這篇文章主要介紹了Android TV開(kāi)發(fā):實(shí)現(xiàn)3D仿Gallery效果的實(shí)例代碼,效果:滾動(dòng)翻頁(yè)+ 頁(yè)面點(diǎn)擊+頁(yè)碼指示器+焦點(diǎn)控制,主要為了移植到電視上做了按鍵事件和焦點(diǎn)控制。2018-05-05
Android技巧一之啟動(dòng)屏+新功能左右導(dǎo)航邏輯
這篇文章主要介紹了Android技巧一之啟動(dòng)屏+新功能左右導(dǎo)航邏輯的相關(guān)資料,需要的朋友可以參考下2016-01-01

