7

我正在使用 jquerymobile 开发一个 javascript/HTML 应用程序,它向远程服务器发出 ajax 请求。该应用程序在 Chrome 上运行良好(仅在禁用网络安全的情况下启动 chrome)但是当我将它嵌入到 Android 应用程序(一个简单的 webview)的 assets/ 目录中时,远程 ajax 调用失败。因此,我想这可能是一个跨域问题。我知道 phonegap 没有这个问题,但如果可能的话,我不想使用 phonegap。所以问题是:如何在 Android webview 应用程序中禁用跨域保护?

这是活动代码:

public class Moby extends Activity {

@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_moby);

    WebView mbrowser = (WebView) findViewById(R.id.webView1); //get the WebView from the layout XML
    if (Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN) 
        mbrowser.getSettings().setAllowUniversalAccessFromFileURLs(true);
    //mbrowser.setWebChromeClient(new WebChromeClient());
    mbrowser.setWebViewClient(new WebViewClient());
    mbrowser.loadUrl("file:///android_asset/index.html"); //set the HTML
    WebSettings settings = mbrowser.getSettings();
    settings.setJavaScriptEnabled(true);
}

}

<uses-permission android:name="android.permission.INTERNET" />

而且我已经在我的 html 页面中设置了 jquerymobile 跨域参数:

<script src="script/jquery-1.8.2.js"></script>
<script>
 $(document).bind("mobileinit", function(){
 $.support.cors = true;
 $.mobile.allowCrossDomainPages = true;       
}); 
</script>
<script src="script/jquery.mobile-1.2.0.js"></script>
4

4 回答 4

5

我没有足够的积分将其作为评论发布,但是,请查看以下内容:

ajax 在某些 Android 设备上工作,而不是在其他设备上

具体来说,基于 Chrome 的 webViews 需要以下内容:

webView.getSettings().setAllowUniversalAccessFromFileURLs(true);

编辑:对不起,我刚刚看到你已经在这样做了——我对此进行了测试,它似乎已经解决了我的问题(通过 ajax 加载本地链接时出现 access-control-allow-origin 错误)。

于 2015-01-12T13:42:21.363 回答
5

尝试这个

WebView web=(WebView) findViewById(R.id.webView1);
web.getSettings().setJavaScriptEnabled(true);
于 2015-02-15T08:11:37.747 回答
1

我遇到了同样的问题,我通过在我的 WebViewClient 中覆盖 shouldInterceptRequest 来修复它。我拦截了ajax调用并在java中进行。您必须对 POST 方法执行相同的操作

private class MyWebViewClient extends WebViewClient {
        @Override
        public void onPageFinished(WebView webView, String url) {
            Log.d("test", "onPageFinished");
            loadWebViewJavascriptBridgeJs(webView);
        }

        @Override
        public WebResourceResponse shouldInterceptRequest(WebView webview, WebResourceRequest webrequest)
        {
            Log.d("test", "shouldInterceptRequest");
           return this.handleRequest(webrequest.getUrl().toString());
        }

        @NonNull
        private WebResourceResponse handleRequest(@NonNull String urlString) {
            try {
                URL url = new URL(urlString);
                HttpURLConnection connection = (HttpURLConnection)url.openConnection();
                connection.setRequestProperty("User-Agent", "");
                connection.setRequestMethod("GET");
                connection.setDoInput(true);
                connection.connect();

                InputStream inputStream = connection.getInputStream();
                return new WebResourceResponse("text/json", "utf-8", inputStream);
            } catch (MalformedURLException e) {
                e.printStackTrace();
                return null;
            }
            catch (ProtocolException e) {
                e.printStackTrace();
                return null;
            }catch (IOException e) {
                e.printStackTrace();
                return null;
            }

        }
    }

当我启动我的 webview 时,我实例化了我的 WebViewClient

 mWebView.setWebViewClient(new MyWebViewClient());
于 2016-04-15T07:33:48.003 回答
-1

在您的 AndroidManifest.xml 中,是否有这一行:

<uses-permission android:name="android.permission.INTERNET" />
于 2012-12-19T16:33:55.293 回答