著论准过秦,作赋拟子虚。这篇文章主要讲述带有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;
}
}
【带有IFrames Chrome 63的Android Cordova应用程序无请求标题Cookie】html / main.html(在assets文件夹中)
<
html>
<
head>
<
base href="file:///android_asset/html/">
<
link type="text/css" rel="stylesheet" href="https://www.songbingjia.com/css/main.css" />
<
/head>
<
body>
<
iframe src="http://img.readke.com/220523/0G6331044-0.jpg
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
推荐阅读
- Android - 保持会话活动直到关闭(直到用户注销)
- 把iframe放在Android应用程序上
- Ionic(无法在Android上的iFrame中显示facebook嵌入式帖子)
- 如何在Spring Boot控制器类中传递参数(app正在使用Spring Security)
- Spring Boot AnnotationConfigEmbeddedWebApplicationContext无法填充动态类中的自动声明的声明字段
- 刷新/重新加载Angular 2 Web App
- Android模型视图控制器实现给出错误
- 如何使用JAVA在Android中拆分ArrayList()
- Android arrayList检索数据