我有一个登录webview和httpclient,需要确认用户是否已登录.
问题是webview和httpclient正在使用其他cookie,因此httpclient无法获取webview cookie.
我阅读了很多人的问题和教程,但没有任何效果.我读到的一些东西:
> ANDROID : Share session between Webview and httpclient
> Http session synchronization between webview and java http client in Android
> How can I get the cookies from HttpClient?
我在Android开发和其他网站上阅读了一些其他教程,但没有任何效果.
另一篇文章:https://stackoverflow.com/questions/28052461/syncing-webview-with-httpclient
问题是cookie不会同步.
我试过的东西:
WebView webview;
webview = (WebView) rootView.findViewById(R.id.webview);
webview.setWebViewClient(new WebViewClient() {
public void onPageFinished(WebView view, String url) {
CookieSyncManager.getInstance().sync();
}
});
webview.getSettings().setDomStorageEnabled(true);
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setUseWideViewPort(true);
webview.setWebChromeClient(new WebChromeClient());
webview.loadUrl("http://www.klh-dev.com/lehava/lehava/system/mlogin.php");
还有一些:
public String IsLoggedIn() {
new Thread(new Runnable() {
@Override
public void run() {
HttpClient client=new DefaultHttpClient();
HttpGet get=new HttpGet(url);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
try {
response_str=client.execute(get,responseHandler);
System.out.println(response_str);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Cookie sessionInfo;
List<Cookie> cookies = client.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(URLn, cookieString);
CookieSyncManager.getInstance().sync();
}
}
}
}).start();
return response_str;
}
* httpget返回1或0
我想从webview中获取cookie并在我的httpclient请求中使用它们
编辑(添加darpan的答案):
public static BasicCookieStore getCookieStore(String cookies, String domain) {
String[] cookieValues = cookies.split(";");
BasicCookieStore cs = new BasicCookieStore();
BasicClientCookie cookie;
for (int i = 0; i < cookieValues.length; i++) {
String[] split = cookieValues[i].split("=");
if (split.length == 2)
cookie = new BasicClientCookie(split[0], split[1]);
else
cookie = new BasicClientCookie(split[0], null);
cookie.setDomain(domain);
cs.addCookie(cookie);
}
return cs;
}
public String IsLoggedIn() {
new Thread(new Runnable() {
@Override
public void run() {
String cookies = CookieManager.getInstance().getCookie("http://klh-dev.com/lehava/lehava/system/isloggedin.php");
BasicCookieStore lCS = getCookieStore(cookies, "klh-dev.com");
HttpContext localContext = new BasicHttpContext();
DefaultHttpClient httpclient = new DefaultHttpClient();
httpclient.setCookieStore(lCS);
localContext.setAttribute(ClientContext.COOKIE_STORE, lCS);
HttpGet get=new HttpGet("http://klh-dev.com/lehava/lehava/system/isloggedin.php");
ResponseHandler<String> responseHandler = new BasicResponseHandler();
try {
result=httpclient.execute(get,localContext);
response_str = EntityUtils.toString(result.getEntity());
System.out.println(response_str);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
return response_str;
}
}
EDIT2:终于有效!!
这是我的代码:
public static String IsLoggedIn() {
new Thread(new Runnable() {
@Override
public void run() {
String cookies = CookieManager.getInstance().getCookie(getUrl);
BasicCookieStore lCS = getCookieStore(cookies, "klh-dev.com");
HttpContext localContext = new BasicHttpContext();
DefaultHttpClient httpclient = new DefaultHttpClient();
httpclient.setCookieStore(lCS);
localContext.setAttribute(ClientContext.COOKIE_STORE, lCS);
HttpGet get = new HttpGet("http://klh-dev.com/lehava/lehava/system/isloggedin.php");
try {
result=httpclient.execute(get,localContext);
response_str = EntityUtils.toString(result.getEntity());
System.out.println(response_str);
((MainActivity) getContext).UpdateMenu();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
return response_str;
}
以及关于getUrl变量.
我必须像这样设置一个全局变量:
private static String getUrl;
public String getUrl() {
return getUrl;
}
在每个片段上我都要添加onPageFinished:getUrl = view.getUrl();
谢谢.
最佳答案 在你的代码中,你似乎正在做你想做的事情(从Webview获取cookie并在HttpClient中设置)
编辑:从Mor Haviv的回答 –
您需要定义一个在视图中存储当前URL的全局变量 –
private static String getUrl;
从webview获取cookie –
@Override
public void onPageFinished(WebView view, String url){
getUrl = view.getUrl();
String cookies = CookieManager.getInstance().getCookie(getUrl);
Log.d(TAG, "All the cookies in a string:" + cookies);
}
在你的HttpClient中设置这个’cookie字符串’ –
public static BasicCookieStore getCookieStore(String cookies, String domain) {
String[] cookieValues = cookies.split(";");
BasicCookieStore cs = new BasicCookieStore();
BasicClientCookie cookie;
for (int i = 0; i < cookieValues.length; i++) {
String[] split = cookieValues[i].split("=");
if (split.length == 2)
cookie = new BasicClientCookie(split[0], split[1]);
else
cookie = new BasicClientCookie(split[0], null);
cookie.setDomain(domain);
cs.addCookie(cookie);
}
return cs;
}
//And, use the same 'getUrl' here to fetch the cookie. (Haviv's addition)
String cookies = CookieManager.getInstance().getCookie(getUrl);
BasicCookieStore lCS = getCookieStore(cookies, YOUR_APP_DOMAIN);
HttpContext localContext = new BasicHttpContext();
DefaultHttpClient httpclient = new DefaultHttpClient();
httpclient.setCookieStore(lCS);
localContext.setAttribute(ClientContext.COOKIE_STORE, lCS);
PS – 将您应用的域名设为“YOUR_APP_DOMAIN”
并且,我无法检查代码,因为我没有您的域名.