【问题标题】:Bypass SSL Error in InAppBrowser Cordova Plugin绕过 InAppBrowser Cordova 插件中的 SSL 错误
【发布时间】:2014-10-24 12:30:37
【问题描述】:

我在 Cordova 项目中添加了一个 InAppBrowser 插件来访问站点并获取令牌,但是当站点在桌面浏览器中正常打开时,从移动浏览器打开时同样会出错。

如果出现 SSL 错误,默认的本机浏览器也会要求继续,但 Cordova InAppBrowser 不会要求此类选项,而是显示错误页面。我正在使用以下代码打开 IAB:

var iab = window.open('http://www.example.com', '_blank', 'location=yes');

关于如何绕过 InAppBrowser 中的 SSL 错误的任何想法?

【问题讨论】:

  • 没有检查,因为不再需要该功能。希望有人能解决这个问题。

标签: javascript cordova inappbrowser


【解决方案1】:

我将扩展相关问题 (phonegap inappbrowser https pages not loading) 的答案。这仅适用于 Android,抱歉仍在 iOS 上工作。

添加此代码:

    public void onReceivedSslError(WebView view,
                SslErrorHandler handler, SslError error) {
        Log.e("Error", "Received SSL error"+ error.toString());
        handler.proceed();
    }

从插件到 InAppBrower.java 文件。具体来说,它应该在 InAppBrowserClient 类下。

希望这会有所帮助!

【讨论】:

  • 这是在 plugins/cordova-plugin-inappbrowser/src/android/InAppBrower.java 中完成的吗??
  • 是的。事实上,我在“onReveivedError”函数下面添加了它。
  • 我添加了这个,但问题仍然存在。我正在尝试调用自签名网址。
  • @hybrid 您必须在插件文件更改后删除 android 平台并添加 android 平台。
【解决方案2】:

将 InAppBrowser.java 下面的正确代码插入到您的插件中 位于platforms\android\src\org\apache\cordova\inappbrowser\InAppBrowser.java

从下面的java代码过滤代码:

import android.net.http.SslError;
import android.webkit.SslErrorHandler;

@SuppressLint("SetJavaScriptEnabled")
public class InAppBrowser extends CordovaPlugin {


    private boolean ignoreSSLError = false;


    private HashMap<String, Boolean> parseFeature(String optString) {
        if (optString.equals(NULL)) {
            return null;
        } else {
            HashMap<String, Boolean> map = new HashMap<String, Boolean>();
            StringTokenizer features = new StringTokenizer(optString, ",");
            StringTokenizer option;
            while(features.hasMoreElements()) {
                option = new StringTokenizer(features.nextToken(), "=");
                if (option.hasMoreElements()) {
                    String key = option.nextToken();
                    if(key.equalsIgnoreCase(IGNORE_SSL_ERROR)) {
                        Boolean value = option.nextToken().equals("no") ? Boolean.FALSE : Boolean.TRUE;
                        map.put(key, value);
                    }
                    else {
                        Boolean value = option.nextToken().equals("no") ? Boolean.FALSE : Boolean.TRUE;
                        map.put(key, value);
                    }

                }
            }
            return map;
        }
    }



    public String showWebPage(final String url, HashMap<String, Boolean> features) {
        // Determine if we should hide the location bar.
        showLocationBar = true;
        showZoomControls = true;
        openWindowHidden = false;
        ignoreSSLError = false;
        if (features != null) {
            Boolean show = features.get(LOCATION);
            if (show != null) {
                showLocationBar = show.booleanValue();
            }
            Boolean SSLError = features.get(IGNORE_SSL_ERROR);
            if(SSLError != null){
                ignoreSSLError = SSLError.booleanValue();
            }
            Boolean zoom = features.get(ZOOM);
            if (zoom != null) {
                showZoomControls = zoom.booleanValue();
            }
            Boolean hidden = features.get(HIDDEN);
            if (hidden != null) {
                openWindowHidden = hidden.booleanValue();
            }
            Boolean hardwareBack = features.get(HARDWARE_BACK_BUTTON);
            if (hardwareBack != null) {
                hadwareBackButton = hardwareBack.booleanValue();
            }
            Boolean cache = features.get(CLEAR_ALL_CACHE);
            if (cache != null) {
                clearAllCache = cache.booleanValue();
            } else {
                cache = features.get(CLEAR_SESSION_CACHE);
                if (cache != null) {
                    clearSessionCache = cache.booleanValue();
                }
            }
        }


            @SuppressLint("NewApi")
            public void run() {

                ((InAppBrowserClient) client).setSSLErrorFlag(ignoreSSLError);

            }
        };
        this.cordova.getActivity().runOnUiThread(runnable);
        return "";
    }



    public class InAppBrowserClient extends WebViewClient {
        EditText edittext;
        CordovaWebView webView;
        boolean ignoreSSLError = false;


        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler,
                                       SslError error) {
            if(this.ignoreSSLError) {
                handler.proceed();
                return;
            }
            else{
                super.onReceivedSslError(view, handler, error);
            }
        }
        public void setSSLErrorFlag(boolean flag) {
            this.ignoreSSLError = flag;
        }

    }
}

THEN ADD THIS LINE IN JAVASCRIPT 

    var options = {
      location: 'yes',
      //clearcache: 'no',
      toolbar: 'yes',
    //clearsessioncache:'no',
          zoom:'no',
          ignoresslerror:'yes'
    };


    $scope.init = function () {
 $ionicPlatform.ready(function() {
 $cordovaInAppBrowser.open('https://192.168.1.80', '_blank', options)
      .then(function(event) {
      })
      .catch(function(event) {
      });
     });

AFTER DONE THIS COMPILE AND EXECUTE THAT'S IT 

FULL VERSION CODE

默认情况下,InAppBrowser 会阻止本地 https 链接(使用假 SSL 证书的链接,第三方无法验证)。理想情况下,用户应该可以选择继续或取消请求,就像默认的桌面浏览器一样。

现在,我们必须在 InAppBrowser 中使用额外的方法来访问假 ssl,例如位置、缩放、硬件返回

【讨论】:

  • 你能解释一下代码的作用以及它是如何解决问题的吗?
  • 在“key.equalsIgnoreCase(IGNORE_SSL_ERROR))”中出现错误,特别是在“IGNORE_SSL_ERROR”和“map.put(key, value);”中请帮忙
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-27
  • 1970-01-01
  • 1970-01-01
  • 2018-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多