Android WebView 与HttpClient 共用本地cookie问题

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

 

<P><SPAN style="FONT-SIZE: 24px">核心代码:
1. mainActivity.java</SPAN></P>
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);
			
		}


	}
<P><SPAN style="FONT-SIZE: 24px">2 DataCenter.java</SPAN></P>
public class DataCenter {

		
	private static String cookies;

	public static String getCookie() {
		return cookies;
	}

	public static void setCookie(String cks) {
		cookies = cks;
	}
	
}
<P><SPAN style="FONT-SIZE: 24px">3 MyHttpClient.java</SPAN></P>
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);

		}

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



 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值