安卓管理我的网络视图的举止,就像在 chrome 中一样(跨域问题)



经过数小时的研究和尝试,我正在寻求社区的帮助。

首先,对不起,我的英语不流利,所以你会发现一些错误。

我无法在我的应用内网页视图和 chrome 浏览器上获得相同的礼仪。我正在考虑跨域问题在我的 Web 视图中没有得到很好的管理......

这就是场景:

我有不同的环境(集成、预生产、生产(。我有一个网址来注册我的应用。这是管理购买Web应用程序(不是由我自己管理(。

Web 应用程序有一个 JavaScript,用于将注册请求发送到服务器。根据环境的不同,Web 应用程序页面和服务器不在同一域中。

当我在集成环境中时,Web 应用程序与服务器位于同一域中。当我在其他环境中时,Web 应用程序与服务器不是同一个域。

当我尝试使用chrome浏览器注册时,完全没有问题,我可以在每个环境中注册。

当我使用 Web 视图时,根据我的环境,我无法注册。

我在 Web 视图中加载本地文件。这个本地html文件包含一个iframe,根据环境的不同,它有它的src标签。如果 src 和服务器在同一个域中,一切都会正常进行。如果没有,就有麻烦了。

问题不是来自服务器,因为我可以在Chrome的每个环境中注册。所以,我想知道如何管理我的网络视图以具有与 chrome 相同的举止,并使注册在每个环境中正常工作。

我尝试直接在myWebView.load(url(中加载Web应用程序的url,但它没有任何改变。

这是我的代码:

package com.something.fr;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.webkit.CookieManager;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
import android.widget.Toast;
public class SimpleWebviewActivity extends FragmentActivity {
private static final String TAG = SimpleWebviewActivity.class.getName();
public static final String URL_KEY = "URL_KEY";
private static final String CODE_KEY = "code";
private static final String OPENING_SUCCESSFUL = "OpeningSuccessful";
private ProgressBar mPbar;
private WebView mWv;
private String mUrl;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Bundle b = getIntent().getExtras();
    if(b != null) {
        mUrl = b.getString(URL_KEY);
    }
    setContentView(R.layout.web_register_activity_layout);
    mPbar = (ProgressBar) findViewById(R.id.web_register_progress_bar);
    mWv = (WebView) findViewById(R.id.web_register_webview);
}
@Override
protected void onResume() {
    super.onResume();

    WebSettings settings = mWv.getSettings();
    settings.setJavaScriptEnabled(true);
    settings.setAllowFileAccessFromFileURLs(true);
    settings.setAllowUniversalAccessFromFileURLs(true);
    settings.setAppCacheEnabled(true);
    settings.setDatabaseEnabled(true);
    settings.setDomStorageEnabled(true);
    mWv.setWebChromeClient(new WebChromeClient() {
        public void onProgressChanged(WebView view, int progress)
        {
            mPbar.setVisibility(ProgressBar.VISIBLE);
            mPbar.setProgress(progress);
            if(progress == 100)
                mPbar.setVisibility(ProgressBar.GONE);
        }
    });
    mWv.setWebViewClient(new WebViewClient() {

        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
        {
            // Handle the error
        }
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url)
        {
            return false;
        }
    });
    mWv.addJavascriptInterface(new WebAppInterface(this), "AndroidDelegate");
    if (mUrl != null && !mUrl.isEmpty()) {
         mWv.loadUrl(mUrl);
    }else {
        Toast.makeText(getApplicationContext(), R.string.no_url_to_load, Toast.LENGTH_SHORT).show();
        finish();
    }
}
public class WebAppInterface {
    Context mContext;
    /** Instantiate the interface and set the context */
    WebAppInterface(Context c) {
        mContext = c;
    }
    /** Show a toast from the web page */
    @JavascriptInterface
    public void handlePostMessage(String jsonMsg) {
        JSONObject postMsgJSON = null;
        try {
             postMsgJSON = new JSONObject(jsonMsg);
             String code = postMsgJSON.getString(CODE_KEY);
             Log.d(TAG, "create account response " + code);
             if (code.contentEquals(OPENING_SUCCESSFUL)) {
                Intent intent = new Intent(getApplicationContext(), Login.class);
                startActivity(intent);
                finish();
            }
        } catch (JSONException e) {
            Log.e(TAG,"error parsing json from postmessage : " + jsonMsg);
            Log.e(TAG, "", e);
        }
    }
}
}

这是从网络控制台获得的日志:

10-08 21:07:06.975: E/Web Console(10259): XMLHttpRequest cannot load https://www.name_of_the_server_domain.fr/services/compte/ouvrir. Request header field Content-Type is not allowed by Access-Control-Allow-Headers.:1
10-08 21:07:07.020: W/Web Console(10259): Error for [create]@[https://www.name_of_the_server_domain.fr/services/compte/ouvrir] response : {"readyState":0,"responseText":"","status":0,"statusText":"error"}:9

我希望你能理解我的问题,希望你能帮助我。

对不起我的英语。

尝试添加此内容以忽略 SSL 错误

@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
    handler.proceed(); // Ignore SSL certificate errors
}

new WebViewClient()

如果你给一些html页面的代码,女巫使用XMLHttpRequest会更好

相关内容

  • 没有找到相关文章