我已经看到了关于它应该如何与旧版本一起工作的答案,
DefaultHttpClient但是没有一个很好的例子HttpURLConnection
我正在使用HttpURLConnectionWeb应用程序发出请求.在我的Android应用程序开始时,我使用CookieHandler.setDefault(new CookieManager())自动处理会话cookie,这工作正常.
在登录后的某个时刻,我想用Web应用程序向用户显示实时页面WebView而不是在后台下载数据HttpURLConnection.但是,我想使用我之前建立的相同会话来防止用户再次登录.
如何复制饼干从java.net.CookieManager使用HttpURLConnection到android.webkit.CookieManager使用的WebView,所以我可以共享会话?
cookies android httpurlconnection single-sign-on android-webview
让我从我想要的开始:
我想制作一个应用程序part native and part webviews.
问题 - 维护本机和Webview部件之间的会话.
我处理这个的方法:
我打算实现一个本机登录,在其中我向用户提供两个EditTextboxes和一个按钮,用户输入凭据,我将它们作为JSON发布到服务器.
服务器响应成功或错误.基于Success标志,我读取了此连接的标头值并解压缩SessionCookie:
switch (responseCode) {
case 200:
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
//IF SUCCESS
Map<String, List<String>> map = conn.getHeaderFields();
for (Map.Entry<String, List<String>> entry : map.entrySet()) {
System.out.println("Key : " + entry.getKey() + " ,Value : " + entry.getValue());
}
SSID = map.get("Set-Cookie").toString();
SSID = SSID.substring(1,SSID.length()-1);
return response.toString(); …Run Code Online (Sandbox Code Playgroud) 语境:
$cookies.put()问题:
在Android上,如果用户在$cookies.put()调用30秒后终止应用程序,则cookie将在下次重新启动时消失.
如果用户等待超过30秒(如35秒或更长时间),一切正常.
题:
我们如何强制立即保存cookie(或至少更快)?
笔记:
我需要将一个具有本机登录屏幕的应用程序与在 webview (混合应用程序)内运行的应用程序的其余部分集成。这听起来像是一种常见的方法,但我在将会话数据(cookie)从本机代码传输到 webview 时遇到问题,我认为这与 CookieManager 的异步行为有关。
有时,在某些设备上,cookie 要么被删除,要么不应用。据我所知,这可能是因为removeSessionCookie、setCookie 和sync 在它们自己的线程中异步运行。我不太理解来自其他编程语言的 Java 中的这一点,因为似乎没有任何钩子可以知道任务何时完成 EG 回调、事件、asyc/await 等。
那么问题是如何知道 Android/Java 中的异步任务何时完成?我遇到过同步块语法,但它看起来不会等待诸如removeSessionCookie之类的事情完成。
我的代码看起来有点像这样:
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeSessionCookie(); // problem
CookieSyncManager.getInstance().sync(); // maybe problem
List<Cookie> cookies = httpClient.getCookieStore().getCookies();
for (int i = 0; i < cookies.size(); i++) {
Cookie cookie = cookies.get(i);
String cookieString = cookie.getName() + "=" + cookie.getValue();
cookieManager.setCookie(url, cookieString);
}
CookieSyncManager.getInstance().sync();
Run Code Online (Sandbox Code Playgroud)