我实际上在WebView中记录了会话。 但我也使用httpclient来发送和从网络获取数据。我在互联网上看到,获取WebView的内容是不可能的,所以我需要使用我的httpclient从Web服务获取数据。
问题是这个web服务使用会话......我的会话在我的WebView中,所以httpclient没有它,我无法访问web服务的内容。
我看到很多关于这个问题的帖子,但我没有理解解决方案。
这是我在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);
答案 0 :(得分:15)
所以,这就是我所做的,它对我有用 -
HttpRequestBase request = new HttpGet(uri);
request.addHeader("Cookie", getCookieFromAppCookieManager(uri.toString()));
现在,getCookieFromAppCookieManager的实现如下 -
该方法从应用程序CookieManager获取给定URL的cookie。应用程序CookieManager管理应用程序的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;
}
答案 1 :(得分:10)
关注此tuto:
http://metatroid.com/article/Android:%20handling%20web%20service%20authentication
===============================这里的网页内容=====
您可能在Android中发现的事情是Web身份验证。 大多数网站发布cookie来跟踪会话ID并保持用户登录。为了维护此身份验证,您需要在活动之间以及http客户端和Web视图之间保持Cookie同步。
我最终做的方法,似乎工作得很好,是创建一个扩展Application的类,然后定义一个HttpClient,用于整个Application的其余部分。该代码如下:
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;
}
该类还创建了一个适用于AsyncTasks并同时发出多个http请求的HttpClient。对于ClientConnectionManager使用ThreadSafeClientConnManager,您可以在AsyncTasks中运行http请求,而不会在按下后退按钮并启动第二个或第三个时关闭力。
它还会创建一个可在您的所有活动中访问的默认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。