ANDROID:在Webview和httpclient之间分享会话

我实际上在我的WebView中logging会话。 但我也使用httpclient发送并从networking获取数据。 我在互联网上看到,无法获取WebView的内容,所以我需要使用我的httpclient从web服务获取数据。

问题是这个web服务使用会话…我的会话是在我的WebView,所以httpclient没有它,我不能访问web服务的内容。

我看到很多关于这个问题的post,但我不明白这个解决scheme。

这是我在onPageStarted上做的:

CookieManager mgr = CookieManager.getInstance(); Log.i( "URL", url ); Log.i("Cookie",mgr.getCookie("mywebsite.com")); String cookie_string = mgr.getCookie("mywebsite.com"); if(cookie_string.length() > 1) { Data.instance().getPref().edit().putString("cookie",cookie_string).commit(); } 

我看到我有这样的事情,所以我希望那些也包括会议:(我删除号码)

 __utma=......(number)......; __utmc=number; __utmz=number.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); wt3_eid=%number%number; wt3_sid=%number 

然后我不知道该怎么做才能在我的httpclient中设置这个cookie。 我尝试了,没有成功:

 HttpClient client = new DefaultHttpClient(); BasicCookieStore cookieStore = new BasicCookieStore(); String login_cookie_string = Data.instance().getPref().getString("cookie", ""); String[] cookie_parts = null; if(login_cookie_string.length()> 0) { //debug_view.setText(login_cookie_string); Log.d("COOKIE", login_cookie_string); cookie_parts = login_cookie_string.split(";"); for(int t=0;t < cookie_parts.length;t++) { String[] cookieContent = cookie_parts[t].split("="); Cookie login_cookie = new BasicClientCookie(cookieContent[0],cookieContent[1]); ((BasicClientCookie) login_cookie).setDomain("mywebsite.com"); cookieStore.addCookie(login_cookie); } } ((AbstractHttpClient) client).setCookieStore(cookieStore); 

Solutions Collecting From Web of "ANDROID:在Webview和httpclient之间分享会话"

所以,这就是我所做的,它为我工作 –

 HttpRequestBase request = new HttpGet(uri); request.addHeader("Cookie", getCookieFromAppCookieManager(uri.toString())); 

现在,getCookieFromAppCookieManager的实现如下所示 –
该方法从应用程序CookieManager获取给定URL的Cookie。 应用程序CookieManagerpipe理应用程序的WebView实例使用的Cookie。

 @param url the URL for which the cookies are requested @return value the cookies as a string, using the format of the 'Cookie' HTTP request header @throws MalformedURLException public static String getCookieFromAppCookieManager(String url) throws MalformedURLException { CookieManager cookieManager = CookieManager.getInstance(); if (cookieManager == null) return null; String rawCookieHeader = null; URL parsedURL = new URL(url); // Extract Set-Cookie header value from Android app CookieManager for this URL rawCookieHeader = cookieManager.getCookie(parsedURL.getHost()); if (rawCookieHeader == null) return null; return rawCookieHeader; } 

按照这个tuto:

http://metatroid.com/article/Android:%20handling%20web%20service%20authentication

===============================这里的网页=====的内容

您可能会发现自己在Android中执行的操作是Webauthentication。 大多数网站发出一个cookie来跟踪会话ID并保持用户login。为了保持这种身份validation,您需要保持cookie在活动之间以及http客户端和webviews之间保持同步。

我最终做的这个方法好像工作得很好,就是创build一个扩展Application的类,然后定义一个单独的HttpClient来在应用程序的其余部分使用。 该代码如下所示:

 public class AppSettings extends Application { private static final DefaultHttpClient client = createClient(); @Override public void onCreate(){ } static DefaultHttpClient getClient(){ return client; } private static DefaultHttpClient createClient(){ BasicHttpParams params = new BasicHttpParams(); SchemeRegistry schemeRegistry = new SchemeRegistry(); schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); final SSLSocketFactory sslSocketFactory = SSLSocketFactory.getSocketFactory(); schemeRegistry.register(new Scheme("https", sslSocketFactory, 443)); ClientConnectionManager cm = new ThreadSafeClientConnManager(params, schemeRegistry); DefaultHttpClient httpclient = new DefaultHttpClient(cm, params); httpclient.getCookieStore().getCookies(); return httpclient; } 

这个类还创build了一个适用于AsyncTasks的HttpClient,并且可以同时创build多个http请求。 为ClientConnectionManager使用ThreadSafeClientConnManager让你在AsyncTasks中运行http请求,而不需要在按下后退button时启动第二个或第三个button。

它还创build了一个可以在您所有活动中访问的默认Cookie存储。 你可以通过调用getClient()方法在你的其他活动中使用它。

例如

 public class SomeActivity extends Activity { static DefaultHttpClient mClient = AppSettings.getClient(); ... try { HttpGet httpget = new HttpGet('URL'); HttpResponse response; response = mClient.execute(httpget); ... } ... } 

如果你觉得有必要使用webview,并需要它访问和使用相同的cookie作为你的客户端。 您可以使用CookieManager同步客户端的Cookie存储:(在onPageStarted方法中)

 DefaultHttpClient mClient = AppSettings.getClient(); Cookie sessionInfo; List<Cookie> cookies = mClient.getCookieStore().getCookies(); if (! cookies.isEmpty()){ CookieSyncManager.createInstance(getApplicationContext()); CookieManager cookieManager = CookieManager.getInstance(); for(Cookie cookie : cookies){ sessionInfo = cookie; String cookieString = sessionInfo.getName() + "=" + sessionInfo.getValue() + "; domain=" + sessionInfo.getDomain(); cookieManager.setCookie("example.com", cookieString); CookieSyncManager.getInstance().sync(); } } 

您需要将example.com切换到正确的域名。