我有这个场景,我的应用程序在webView中显示为2页的登录过程。
第一页仅询问您计划连接的域。 第二页要求提供凭证。
我正在尝试在webView中执行登录,然后从我的本机代码执行请求。 我意识到我需要从webView获取存储的cookie(但是从哪个url?来自第一页或第二页?),然后使用cookie来获取本机代码请求。
有人可以告诉我该如何去做吗?登录过程很简单 - 用户通过webview登录 - 很好。现在,我知道如何使用cookie管理,但我不知道我想要找哪个cookie - 它是第一个登录页面的URL吗?是第二个吗?这有关系吗?
接下来,如何使用cookie通过GET请求发回服务器,以便服务器知道我已通过身份验证?
我很感激答案,我很无能为力,求得帮助:)
答案 0 :(得分:3)
我做了与你相反的事情:我使用loopj Android Asynchronous Http Client登录,并希望会话cookie应用于同一网站的webview。我不知道它是否会对您有所帮助,但是,我将发布我的代码以复制Cookie。也许看到这个过程可以帮助您查找所需的项目......将cookie从webview复制到HTTP。我无法提供进一步的帮助,因为我在Android上相当新。 (当然,我从其他人的帖子中调整了我的代码。)
类变量声明:
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。我觉得你没事,做同样的事......因此,不用担心是从第一页还是第二页。
答案 1 :(得分:3)
由于接受的答案并未真正描述如何完成:
将这些行放在应用启动的位置:
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();
答案 2 :(得分:0)
最后我找到了自己的方式而且非常简单。
用户通过webview登录后,会在设备上设置cookie。 稍后我想在服务上执行Native api调用时,我向cookie管理员询问基于url设置的cookie。
然后,我接下来用于在服务器上进行身份验证的重要标头,并将其与我的api调用一起发送。