如何在DefaultHttpClient
和WebView
之间共享Cookie?
答案 0 :(得分:0)
用户解决了在DefaultHttpClient和WebView之间共享Cookie的问题。 This solution worked for him,所以他想在那里分享完整的代码。
LoginActivity.java,核心代码是doPost:
private int mNumber = 3;
public InputStream doPost(String url, HashMap<String, String> params,
String headParam, ArrayList<String> keyValues) {
DefaultHttpClient httpClient = null;
InputStream inputStream = null;
HttpResponse httpResponse = null;
int statusCode = -1;
httpClient = (DefaultHttpClient) NetworkManager.getHttpClient();
HttpPost httpPost = new HttpPost(url);
if (headParam != null) {
httpPost.addHeader("Cookie", headParam);
}
if (params != null) {
List<NameValuePair> httpRequestParams = new ArrayList<NameValuePair>();
Iterator<Entry<String, String>> iter = params.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<String, String> entry = iter.next();
String key = entry.getKey();
String val = entry.getValue();
if (val.equals("multi")) {
for (String values : keyValues)
httpRequestParams.add(new BasicNameValuePair(key,
values));
} else
httpRequestParams.add(new BasicNameValuePair(key, val));
}
try {
httpPost.setEntity(new UrlEncodedFormEntity(httpRequestParams,
HTTP.UTF_8));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
try {
httpResponse = httpClient.execute(httpPost);
} catch (ClientProtocolException e) {
e.printStackTrace();
httpPost.abort();
} catch (IOException e) {
e.printStackTrace();
httpPost.abort();
if (mNumber >= 1) {
mNumber--;
doPost(url, params, headParam, keyValues);
return null;
}
}
if (httpResponse != null) {
statusCode = httpResponse.getStatusLine().getStatusCode();
if (statusCode == HttpURLConnection.HTTP_OK) {
try {
inputStream = httpResponse.getEntity().getContent();
} catch (IllegalStateException e) {
e.printStackTrace();
httpPost.abort();
} catch (IOException e) {
e.printStackTrace();
}
} else {
if (mNumber >= 1) {
mNumber--;
doPost(url, params, headParam, keyValues);
} else {
}
}
} else {
if (mNumber >= 1) {
mNumber--;
doPost(url, params, headParam, keyValues);
}
}
Config.mCookies = httpClient.getCookieStore().getCookies(); //save cookies
return inputStream;
}
在Config.java中:
public static List<Cookie> mCookies = null;
成功登录后,webview浏览:
List<Cookie> cookies = Config.mCookies;
if (cookies != null && !cookies.isEmpty()) {
CookieSyncManager.createInstance(mContext);
CookieManager cookieManager = CookieManager.getInstance();
for (Cookie cookie : cookies) {
Cookie sessionInfo = cookie;
String cookieString = sessionInfo.getName() + "="
+ sessionInfo.getValue() + "; domain="
+ sessionInfo.getDomain();
cookieManager.setCookie("http://stackoverflow.com", cookieString);
CookieSyncManager.getInstance().sync();
}
}
mWebview.loadUrl(mLink);
setCookie(url, string);
网址需要主机,首先他只使用域名(例如stackoverflow.com
),但它不起作用。它也必须包括主机(例如,http://stackoverflow.com
)。