使用来自 webview 的 cookies 执行 HTTP 请求

Perform HTTP requests using cookies from webview

我有这种情况,我的应用程序在 webView 中显示了一个 2 页的登录过程。

第一页仅询问您计划连接到哪个域。 第二页要求提供凭据。

我正在尝试在 webView 中执行登录,然后从我的本机代码执行请求。 我意识到我需要从 webView 获取存储的 cookie(但从哪个 url?从第一页还是第二页?),然后将 cookie 用于本机代码请求。

有人可以告诉我该怎么做吗?登录过程很简单 - 用户通过 webview 登录 - 很好。现在,我知道如何使用 cookie 管理,但我不知道应该查找哪个 cookie - 是第一个登录页面的 url 吗?是第二个吗?重要吗?

接下来,我如何使用 cookie 将 GET 请求发送回服务器,以便服务器知道我已通过身份验证?

我很感激我一无所知并请求帮助的答案:)

我做了与你相反的事情:我使用 loopj Android 异步 Http 客户端登录,并希望将会话 cookie 应用于同一个网站的 webview。我不知道它是否对您有帮助,但是,我将 post 我的代码用于复制 cookie。也许看到这个过程会帮助你寻找你需要的项目......将 cookie 从 webview 复制到 HTTP。我无法提供进一步的帮助,因为我在 Android 还很陌生。 (当然,我从其他人的 post 中改编了我的代码。)

Class 变量声明:

private AsyncHttpClient loopjClient = new AsyncHttpClient();
private PersistentCookieStore myCookieStore;

onCreate() 初始化:

myCookieStore = new PersistentCookieStore(this);
loopjClient.setCookieStore(myCookieStore);

HTTP登录后:

// get cookies from the generic http session, and copy them to the webview
CookieSyncManager.createInstance(getActivity().getApplicationContext());
CookieManager.getInstance().removeAllCookie();
CookieManager cookieManager = CookieManager.getInstance();

List<Cookie> cookies = myCookieStore.getCookies();
for (Cookie eachCookie : cookies) {
    String cookieString = eachCookie.getName() + "=" + eachCookie.getValue();
    cookieManager.setCookie("http://www.example.com", cookieString);
    //System.err.println(">>>>> " + "cookie: " + cookieString);
}
CookieSyncManager.getInstance().sync();
// holy ****, it worked; I am automatically logged in for the webview session

注意 loopj 就像 webview,因为所有的 cookie 管理和发送都是自动的。我只是复制该域的所有 cookie。我想你也可以,做同样的事情......因此,不用担心是从第一页还是第二页。

最后我找到了自己的方法,而且非常简单。

一旦用户通过 webview 登录 - 设备上就会设置一个 cookie。 稍后,一旦我想在服务上执行本机 api 调用,我就向 cookie 管理器询问基于 url.

设置的 cookie

然后我将用于在服务器上进行身份验证的重要 header 与我的 api 调用一起发送。

由于接受的答案并没有真正描述它是如何完成的:

将这些行放在您的应用开始的地方:

    CookieHandler.setDefault(new CookieManager()); // Apparently for some folks this line works already, for me on Android 17 it does not.
    CookieSyncManager.createInstance(yourContext); // or app will crash when requesting cookie

然后在你的连接中:

       String cookies = CookieManager.getInstance().getCookie(urlString);
        URL url = new URL(urlString);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(10000 /* milliseconds */);
        conn.setConnectTimeout(15000 /* milliseconds */);
      //  conn.setRequestMethod("GET");
      //  conn.setDoInput(true);
        if (cookies != null)
            conn.setRequestProperty("Cookie", cookies);
        // Starts the query
        conn.connect();