WebView Javascript来自本地HTML文件的跨域

ori*_*rel 29 javascript android cross-domain same-origin-policy android-webview

我将一个本地html文件(从assets文件夹)加载到应用程序WebView.在HTML中我运行了一个jQuery.getJSON(url).url是一个远程服务器.

这个动作失败了,我猜是因为一个不同的起源问题(跨域).我在chrome上运行相同的文件,并在那里专门说明.

有没有办法允许Android中的WebView在本地加载的HTML文件中从远程服务器加载数据?

Ste*_*any 53

今天早上我找到了似乎有效的解决方案.

Java部分

初始化WebView:

WebView _webView = (WebView) this.findViewById(R.id.id_of_your_webview_in_layout);
Run Code Online (Sandbox Code Playgroud)

获取WebView设置:

WebSettings settings = _webView.getSettings();
Run Code Online (Sandbox Code Playgroud)

设置以下设置:

settings.setJavaScriptEnabled(true);
settings.setAllowFileAccessFromFileURLs(true); //Maybe you don't need this rule
settings.setAllowUniversalAccessFromFileURLs(true);
Run Code Online (Sandbox Code Playgroud)

现在您可以通过标准方式加载您的html文件:

_webView.loadUrl("file:///android_asset/www/index.html");
Run Code Online (Sandbox Code Playgroud)

Javascript部分

通过标准方式创建XHR请求

var xhr = new XMLHttpRequest();
xhr.open("get", "http://google.com", false);
xhr.send();
Run Code Online (Sandbox Code Playgroud)

在某处打印结果

document.body.innerHTML = xhr.responseText
Run Code Online (Sandbox Code Playgroud)

注意: 此过程仅适用于16级或更高级别的API(至少文档说明了这一点).

  • 根据setAllowFileAccessFromFileURLs和setAllowUniversalAccessFromFileURLs的文档,对于ICS和更早版本,它们曾经被设置为true.从JellyBean开始,他们将其关闭.如果您尝试从本地HTML页面加载本地JS文件,则需要启用它们. (2认同)

Com*_*are 1

我将本地 html 文件(从资产文件夹)加载到应用程序 WebView

请注意,您没有说明您是如何做到这一点的。我猜测这是通过loadUrl()URL 进行的file:///android_asset

有没有办法让Android中的WebView从远程服务器加载数据到本地加载的HTML文件上?

尝试使用loadDataWithBaseURL()加载内容,提供远程服务器上的 URL 作为基本 URL。