使用来自 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();
我有这种情况,我的应用程序在 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();