带有IFrames Chrome 63的Android Cordova应用程序无请求标题Cookie
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带有IFrames Chrome 63的Android Cordova应用程序无请求标题Cookie相关的知识,希望对你有一定的参考价值。
自从android 63上的Chrome 63发布以来,2017年12月6日,我遇到了我公司基于Cordova的Android应用程序的问题。此应用程序包含IFrame,允许用户从应用程序中导航我公司的部分电子商务网站。
IFrame中加载的页面之间的导航不再在请求标头中发送任何cookie信息。
存储在cookie中的诸如Session Ids之类的信息不会传递到下一页,这反过来会导致下一页开始一个全新的用户会话!
然而,奇怪的是,在IFrame上的页面中执行的任何AJAX调用(例如,检索篮子中的项目数)和资产请求(css js,图像文件等)确实在请求标头中发送cookie信息。这些标头中的会话ID在页面之间是相同的,表示会话持久性。
正在创建Cookie,我可以在公司域下的“应用程序”面板中使用Chrome开发人员工具时看到它们。他们只是没有被传递到下一页。
我在Android 7.1.1设备上遇到过这个问题。当我在此设备上停用Chrome应用时,应用中IFrame中的Cookie请求标头会再次正常工作,可能是Cordova Webview在禁用时不再使用Chrome?
有谁知道可能导致这个问题的原因?是否与Chrome 63中的SameSite cookie或严格的站点隔离更改或其他与安全相关的更改有关?
该问题与2016年10月修复的Chromium bug类似:https://bugs.chromium.org/p/chromium/issues/detail?id=634311
但是,Webview确实在Cordova库的系统CookieManager类中启用了第三方cookie(Cordova Android 6.4.0):
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
cookieManager.setAcceptThirdPartyCookies(webView, true);
}
如果我没有明确说明任何内容,请道歉。如果有人可以帮助解决这个问题,我很乐意提供更多信息。
这个bug被提交并解决了in the Chromium Bug tracker。根据Chromium开发人员的说法,从App方面来看,我们无能为力。
这是一种在没有Cordova的情况下重现问题的方法。它使用http://httpbin.org/cookies/set?k2=v2&k1=v1来测试cookie。使用Android System WebView v.63,不会发送cookie。使用以前的版本,它们会被发送我希望它可以帮助找到问题的答案。以下是完整Android项目的链接:https://www.dropbox.com/s/s53wfy71uou11rh/test-webview.zip?dl=0
main activity.Java
package com.example.mihai.twv;
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.CookieManager;
import android.webkit.WebView;
import java.io.InputStream;
public class MainActivity extends AppCompatActivity {
WebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initWebView();
loadWebView();
}
private void initWebView() {
mWebView = (WebView) findViewById(R.id.webView);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
CookieManager.getInstance().setAcceptThirdPartyCookies(mWebView, true);
}
}
private void loadWebView() {
String url = "http://httpbin.org";
String html = getLocalFileContents("html/main.html");
mWebView.loadDataWithBaseURL(url, html, "text/html", "UTF-8", null);
}
private String getLocalFileContents(String filepath) {
String response = "";
try {
InputStream is = getAssets().open(filepath);
int size = is.available();
StringBuilder builder = new StringBuilder();
byte[] buffer = new byte[size];
while (is.read(buffer) != -1) {
builder.append(new String(buffer, "UTF-8"));
}
is.close();
response = builder.toString();
} catch (Exception e) {
}
return response;
}
}
html / main.html(在assets文件夹中)
<html>
<head>
<base href="file:///android_asset/html/">
<link type="text/css" rel="stylesheet" href="../css/main.css" />
</head>
<body>
<iframe src="http://httpbin.org/cookies/set?k1=v1&k2=v2" frameborder="0"></iframe>
</body>
css / main.css(在assets文件夹中)
html,
body,
iframe {
width: 100%;
height: 100%;
}
这是Chrome中的一个错误,它已被修复。我再次更新了Chrome,现在我的设备上运行正常。
我们可以从中学到的是Cordova依赖其他应用......
如果您的IFrame在https网址上浏览,则Chrome 63会生成与Symantec生成的SSL证书相关联的安全警报。 Cordova应用程序不再接受IFrame中的导航
有关更多信息,请参见下文:https://security.googleblog.com/2017/09/chromes-plan-to-distrust-symantec.html
以上是关于带有IFrames Chrome 63的Android Cordova应用程序无请求标题Cookie的主要内容,如果未能解决你的问题,请参考以下文章
轮播内幻灯片的延迟加载内容(内容为oEmbeds/iframes)
在 iFrames 中使用字段自动在输入上输入键 Tab 到下一个输入