一 . Android 中 webView 使用Cookie的相关问题:
WebView 是基于webkit 内核的UI控件 (就是说我们再用CookieManager的时候要用webkit包下的),
WebView相当于一个浏览器客户端,在本地维护每次会话的Cookie,保存在data/data/package_name/app_WebView/Cookies.db数据库中
(也就是说WebView的Cookie是和http请求的Cookie保存的地方不一样的),当webView进行url请求时,就会在Cookie数据库中根据url
去寻找对应的Cookie,携带发送给服务器(如果没有就不携带)。
WebView的得管理是由android.webkit.CookieManager 维护的。
1.WebView获取Cookie:
mWebView.setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view,String url){
//webView页面加载完成会将Cookie信息维护到Cookie数据库中
android.webkit.CookieManager manager=android.webkit.CookieManager.getInstance();
String cookieStr=manager.getCookie(url);
super.onPageFinshed(view,url);
}
});
或者可以在程序的任意位置:
android.webkit.CookieManager manager=android.webkit.CookieManager.getInstance();
String cookieStr=manager.getCookie(url);
如果数据库中没有这个url路径下的cookie就会返回null;
举例: 百度www.baidu.com进行WebView请求返回的Cookie为:
BAIDUID=9226902D387AE998971687E2D6843563:FG=1; bd_af=1; BDSVRTM=19; H_WISE_SIDS=114550_109776_102433_108373_100100_116291_116399_116559_
107319_115863_116476_114797_116094_116309_115538_115446_116387_116603_115351_114276_116411_110085; BDORZ=AE84CDB3A529C0F8A2B9DCDD1D18B695
2.WebView请求时设置Cookie
如果有需求,需要在加载webView的时候需要修改或者添加加载url的Cookie,比如在在app登录后需要将登陆的身份信息在WebView访问服务器的
时候携带,一般是seesionID(服务器seesion的穿创建是和Cookie密切关联的,比如在www.baidu.com服务器中生成的Cookie标识seessionID的字段为BAIDUID)
这样,WebView和app中http请求就会是一个Cookie信息,即使在app中登陆了,在访问WebView的时候也会让服务器明白,哦,这个WebView是谁谁谁登陆的
然后去找在服务器端之前app登陆创建的seesion。
webView设置Cookie信息,设置要在setJavaScriptEnabled之后,loadUrl之前,也就是中间的位置,否则的话设置无效。
android.webkit.CookieManager manager=android.webkit.CookieManager.getInstance();
manager.setCookie("url","cookie")
注:
假如:manager.setCookie(".abc.com","ASD="a")
manager.setCookie(".abc.com","ASD="b")
name值相同会覆盖值,manager.getCookie中ASD=b;
格式:cookieManager.setCookie(url, key + "=" + cookie.getValue() + ";domain=" + "xxxx.com"+";path=/");
二 . Android 中http请求获取Cookie与自定义Header
1.httpurlConnection:
设置header: connection.setRequestProperty(key,value);
这个应该是不会自动存储COOKIE信息,可以设置存储在CookieManager 但该类不是单利模式 所以建议自定义存储
CookieManager manager=new CookieManager();
String urlString = "http://www.baidu.com";
CookieHandler.setDefault(manager);URL url = null;
try {
url = new URL(urlString);
URLConnection connection = url.openConnection();Object obj = connection.getContent();url = new URL(urlString);
connection = url.openConnection();obj = connection.getContent();CookieStore cookieJar = manager.getCookieStore();
List<HttpCookie> cookies = cookieJar.getCookies();for (HttpCookie cookie : cookies) {
Log.i("URLHTTPINFO",cookie.getName()+":*:"+cookie.getValue());}} catch (MalformedURLException e) {
e.printStackTrace();} catch (IOException e) {
e.printStackTrace();}conn获取方式:
String cookieStr = conn.getHeaderField("Set-Cookie");
2.httpClient 过时了
Httpclient会存储当次请求的cookie内容,存储位置在 httpClient.getCookieStore 但是apache建议自定义cookie存储方式,
因为cookiestore把cookie放在arraylist里很容 易被系统回收。
3.okhttp
okHttpClient=new OkHttpClient(); Request builder =new Request.Builder() .url("http://www.baidu.com") .addHeader("User-Agent","android") .addHeader("Content-Type","text/html; charset=utf-8") .build(); okHttpClient.newCall(builder).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { Headers headers = response.headers(); StringBuffer sb=new StringBuffer(); for (int i=0;i<headers.size();i++){ sb.append(headers.name(i)+":"+headers.value(i)); Log.i("OKCOOKIESPINFO",headers.name(i)+":"+headers.value(i)); } } });