【问题标题】:Android webview - XMLHttpRequest cannot load Origin <url> is not allowed by Access-Control-Allow-OriginAndroid webview - XMLHttpRequest 无法加载 Origin <url> 不允许 Access-Control-Allow-Origin
【发布时间】:2014-06-12 19:55:48
【问题描述】:

我有一个应用程序可以在 android webview 中加载一个完整的网站。 android 项目中的本机代码使用 Android Jockey 库与网页交互,反之亦然。

在我遇到XMLHttpRequest cannot load ... Origin &lt;url&gt; is not allowed by Access-Control-Allow-Origin 错误的一种状态下,一切正常。当网站(在 webview 中加载)对后端 api 进行 ajax 调用时,就会发生这种情况。

我的网站位于 m.mywebsite.com,它对 api.mywebsite.com 进行 ajax 调用 - 特别是两个独立的子域,但这似乎在 iOS 上运行良好。

我正在 Android v4.4.2 上对此进行测试。通过再次编译目标 sdk 15 和 19 对其进行了测试,但没有区别。

我已将大部分设置应用于我的 web 视图,如下所示:

webView = (WebView) findViewById(R.id.webView);
    webView.getSettings().setLoadWithOverviewMode(true);
    webView.getSettings().setBuiltInZoomControls(false);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setDatabaseEnabled(true);
    webView.getSettings().setDomStorageEnabled(true);
    webView.getSettings().setAllowContentAccess(true);

    webView.getSettings().setAllowUniversalAccessFromFileURLs(true);
    webView.getSettings().setAllowFileAccessFromFileURLs(true);
    webView.getSettings().setAllowContentAccess(true);
    webView.getSettings().setAppCacheEnabled(true);

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
        webView.getSettings().setDatabasePath("/data/data/" + webView.getContext().getPackageName() + "/databases/");
    }

    webView.getSettings().setSupportZoom(false);
    webView.setWebChromeClient(new WebChromeClient());
    webView.setInitialScale(0);

以下是我的骑师整合:

if (Utils.isNetworkAvailable(this)) {
        jockey = JockeyImpl.getDefault();
        jockey.configure(webView);
        webViewClient = new MyWebViewClient(this);
        jockey.setWebViewClient(webViewClient);

        setJockeyEvents();
        webView.loadUrl(EnvironmentManager.getStartUpURL());
    } 

有人遇到类似问题或有解决方案吗?

谢谢!

【问题讨论】:

  • 您好,请问您在哪里可以解决这个问题?我们正在尝试从 System WebView 更改 http 和 websocket 调用的源头。所以我想我们和你有同样的问题,你解决了吗?

标签: javascript android ajax webview cross-domain


【解决方案1】:

您好,我认为您需要为您的网页视图设置一个设置。实际上这个问题是API级别16以上的设备出现的。找到以下代码:

if (Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN) {
  webView.getSettings().setAllowUniversalAccessFromFileURLs(true);
}

希望它对你有用。

【讨论】:

    【解决方案2】:

    您可以通过从api.mywebsite.com 上的页面发送适当的Access-Control-Allow-Origin 标头来解决此问题,如下所示:

    Access-Control-Allow-Origin: http://m.mywebsite.com
    

    【讨论】:

    • 只是为了确认一下 - 您的意思是在向 api.mywebsite.com 发出请求的同时从 m.mywebsite.com 的请求中发送此标头,还是反过来?
    • 我的意思是反过来——将响应中的标头从 api.mywebsite.com 发送到 m.mywebsite.com。
    猜你喜欢
    • 1970-01-01
    • 2012-05-25
    • 2013-01-24
    • 2013-06-14
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 2013-09-15
    • 2012-09-28
    相关资源
    最近更新 更多