Android WebView 与HttpClient 共用本地cookie问题

参考:https://gist.github.com/arpit/610754

http://www.cnblogs.com/loveyakamoz/archive/2011/07/21/2113246.html

我是为了解决:WebView 缓存下来的cookie可以用于HttpClient,因为我的HttpClient单独需要取一些数据,但是依赖于本地的cookie。如果没有cookie返回来的是登录页面

核心代码: 1. mainActivity.java

public void onCreate(Bundle savedInstanceState) { View v = inflater.inflate(R.layout.main_fragment, container, false); mWebView = (WebView) v.findViewById(R.id.webview); MyWebViewClient webviewClient = new MyWebViewClient(); mWebView.setWebViewClient(webviewClient); WebSettings webset = mWebView.getSettings(); webset.setJavaScriptEnabled(true); mWebView.loadUrl(Constants.TALKGROUP_URL); return v; } private class MyWebViewClient extends WebViewClient { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); IWLog.d(TAG, "onPageFinished() url is:"+url); /* 将cookie保存起来*/ String c = CookieManager.getInstance().getCookie(url); DataCenter.setCookie(c); CookieSyncManager.getInstance().sync(); } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { IWLog.d(TAG, "onReceivedError() errorCode:" + errorCode+"----failingUrl"+failingUrl); super.onReceivedError(view, errorCode, description, failingUrl); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { IWLog.d(TAG, "shouldOverrideUrlLoading() url:" + url); return super.shouldOverrideUrlLoading(view, url); } }

2 DataCenter.java

public class DataCenter { private static String cookies; public static String getCookie() { return cookies; } public static void setCookie(String cks) { cookies = cks; } }

3 MyHttpClient.java

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URI; import org.apache.http.HttpResponse; import org.apache.http.client.CookieStore; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.protocol.ClientContext; import org.apache.http.impl.client.BasicCookieStore; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.cookie.BasicClientCookie; import org.apache.http.protocol.BasicHttpContext; import com.petsea.data.DataCenter; import com.petsea.data.NavigationUrl; import android.graphics.Bitmap; import android.os.AsyncTask; import android.util.Log; public class MyHttpClient { public static String TAG = "MyHttpClient"; public void execute() { RequestChatListTask task = new RequestChatListTask(); task.execute(); } private class RequestChatListTask extends AsyncTask<Bitmap, Integer, String> { @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected String doInBackground(Bitmap... params) { BufferedReader in = null; DefaultHttpClient httpclient; BasicHttpContext localContext; CookieStore cookieJar; try { httpclient = new DefaultHttpClient(); cookieJar = new BasicCookieStore(); localContext = new BasicHttpContext(); HttpGet httpget = new HttpGet(); httpget.setURI(new URI(NavigationUrl.CHAT_LIST_URL));//这里是你要请求的地址 String _cookie = DataCenter.getCookie(); if(_cookie !=null && !_cookie.equals("")){ String[] cookies = _cookie.split(";"); for(int i=0; i< cookies.length; i++){ String[] nvp = cookies[i].split("="); BasicClientCookie c = new BasicClientCookie(nvp[0], nvp[1]); //c.setVersion(0); c.setDomain("www.baidu.com");//这里是自己的主机地址 cookieJar.addCookie(c); } } localContext.setAttribute(ClientContext.COOKIE_STORE, cookieJar); HttpResponse response = httpclient.execute(httpget,localContext); int code = response.getStatusLine().getStatusCode(); System.out.print("code is="+code);//返回200是正确的 in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); StringBuffer sb = new StringBuffer(""); String line = ""; String NL = System.getProperty("line.separator"); while ((line = in.readLine()) != null) { sb.append(line + NL); } in.close(); String page = sb.toString(); ///System.out.println(page); return page; //success } catch (Exception e) { e.printStackTrace(); } finally { if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } return null; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); } @Override protected void onPostExecute(String result) { super.onPostExecute(result); Log.i(TAG, "onPostExecute result is:" + result); } } }

上面只是我工程的一部分代码,主要来说明问题的。不便把全部代码上传。 我也是调试了一阵才弄出来的。给大家推荐一个工具:WireShark 用于抓取网络包的,可以查看你的http请求以及返回,里面会显示到cookie的内容还有其它格式 下载地址 http://www.wireshark.org/download.html







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值