Webview发送不正确的Origin标头

时间:2014-04-25 14:06:28

标签: android cordova webview android-webview cors

最近我一直在用我的Phonegap应用程序调试一些与CORS相关的问题,并将Tomcat服务器作为后端。

我发现Client(WebView)在Origin Header中发送的值不正确:。值为" file:\" 。

为了排除Phonegap,我从零开始创建了一个Android应用程序并尝试了相同的操作。结果相似。见标题

Request URL:http://medistreet.in/auth2
Request Method:POST
Status Code:403 Forbidden
Request Headers
POST http://medistreet.in/auth2 HTTP/1.1
Accept: application/json, text/plain, */*
**Origin: file://**
User-Agent: Mozilla/5.0 (Linux; Android 4.4.2; XT1033 Build/KXB20.25-1.31) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36
Content-Type: application/json;charset=UTF-8

Android代码是:

public class MainActivity extends Activity {

    private WebView webView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.webview);

        webView = (WebView) findViewById(R.id.webView1);
        webView.getSettings().setJavaScriptEnabled(true);
        WebView.setWebContentsDebuggingEnabled(true);
        webView.setWebViewClient(new WebViewClient());
        webView.loadUrl("file:///android_asset/www/index.html");
        WebSettings settings=webView.getSettings();
        settings.setAllowFileAccessFromFileURLs(true);
    }

}

任何想法??

1 个答案:

答案 0 :(得分:0)

发送Origin标头时,KitKat WebView将发送URL的主机部分。主机的概念并不真正适用于file:// scheme,这就是你获得虚假价值的原因。

我认为前KK WebView使用KURL代替GURL进行URL处理是不同的。 GURL通常比KURL更严格(也更安全),这是两个WebView版本之间不兼容的原因。

loadUrl方法需要额外的标题,但KK WebView不允许您使用该API覆盖Origin标头。

要解决此问题,您可以尝试将loadDataWithBaseURL与medistreet.in一起用作基本网址,或者覆盖WebViewClient.shouldOverrideUrlLoading,以使本地资源看起来像来自服务器。