【问题标题】:Android sync cookies webview and httpclientAndroid同步cookies webview和httpclient
【发布时间】:2014-11-07 09:54:17
【问题描述】:

我有一个登录 webview 和 httpclient 需要确认用户是否登录。 问题是 webview 和 httpclient 正在使用其他 cookie,因此 httpclient 无法获取 webview cookie。

我阅读了很多人的问题和教程,但没有任何效果。我读到的一些东西:

我阅读了一些关于 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 请求中使用它们?
  • 远程更改 - 尝试在 BasicCookieStore lCS = getCookieStore(cookies, "klh-dev.com"); 添加 .klh-dev.com 如果不起作用,我正在调查该问题。
  • @darpan 您的回答对我帮助很大,而且效果很好。我会在评论中告诉你我做了什么并编辑你的答案。我会尽快做的
  • @Darpan 我在问题中添加了我的解决方案。只需编辑您的答案或更新它,我会批准它:)

标签: android cookies webview httpclient


【解决方案1】:

在您的代码中,您似乎在做与您想做的相反的事情(从 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);
}

Reference for above code

在您的HttpClient 中设置这个名为“cookies”的字符串 -

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” 而且,我无法检查代码,因为我没有您的域。

Reference for above code

【讨论】:

  • 我试过你的答案,但我没有成功插入代码。我成功地从 webview 中获取了 cookie(我什至在日志中看到了它)但是设置 cookie 字符串我失败了。无论我把它放在哪里,如果我修改它(我确实导入了所有需要的东西)或为此操作创建一个单独的函数,它都会说语法错误。我编辑了问题并添加了我尝试过的内容。
  • 再次更新,请立即查看,看看为什么不能正常工作。谢谢!
猜你喜欢
  • 2011-08-14
  • 2016-08-30
  • 2011-08-13
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 2018-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多