经过数小时的研究和尝试,我正在寻求社区的帮助。
首先,对不起,我的英语不流利,所以你会发现一些错误。
我无法在我的应用内网页视图和 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
会更好