**

Android Webview 设置Cookie问题

** 鄙人嫖二十,菜鸡一个,多多指教。

最近遇到一个比较坑爹的问题就是webview里添加第三方H5页面,但是数据获取不到,经过一天的折磨发现cookie值每次都会变,再根据谷歌开发者模式定位,cookie每次应该都是固定,每次变化说明本地的cookie有问题,或者为空。

webview有一个CookieManager这个类,他是专门管理cookie的,这个类可以设置一个或多个cookie,而且当你在里面设置好cookie以后接口会自动根据你设置时的url来使用。

一共有两种获取cookie的方法一种是HttpURLConnection获取,一种是直接利用CookieManager获取。

第一种根据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是有一些区别的,看你需要哪一种。

设置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设置道webview里

/**

*@param cookie 上面获取到的存储在本地的cookie字符串

*@param url 要加载的页面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) {//这个代码是清楚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() {

@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();

}

}

注意 注意 注意:重要的事情说三遍有些机型只支持单独设置cookie就比如(瞎写的) session=jashdkjashdkashdk;path=path 如果你直接把这一整串setCookie进入,是设置不进去的,你需要把他们根据分号切割开,一个一个的给它们设置进去。像这种cookieManager.setCookie(url,“session=jashdkjashdkashdk”)(如果你直接设置进去,并且成功了就当我后面说的是废话)

查看原文