0

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

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

我无法在我的应用内 webview 和 chrome 浏览器上获得相同的评价。我正在考虑在我的网络视图中无法很好地管理跨域问题...

那是场景:

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

webapp 有一个 javascript 将注册请求发送到服务器。根据环境,webapp 页面和服务器不在同一个域中。

当我在集成环境中时,webapp 与服务器在同一个域中。当我在其他环境中时,webapp 与服务器不在同一个域中。

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

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

我在我的 webview 中加载了一个本地文件。这个本地 html 文件包含一个 iframe,它的 src 标签取决于环境。如果 src 和服务器在同一个域中,则一切正常。如果没有,那就麻烦了。

问题不是来自服务器,因为我可以在 Chrome 的每个环境中注册。所以,我想知道如何管理我的 webview 以具有与 chrome 相同的行为,并让注册在每个环境中都能正常工作。

我尝试在 myWebView.load(url) 中直接加载 webapp 的 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);
        }
    }
}
}

这是从 webconsole 获得的日志:

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

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

4

1 回答 1

0

也对不起我的英语。

尝试添加这个以忽略 SSL 错误

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

new WebViewClient()

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

于 2013-10-16T10:14:42.903 回答