WebView使用的那些坑-Https

Boss告诉我我们要访问Https的网址,但是我们没有安全证书,因为客户不想要买域名,不想花那个钱。

给我的服务器地址是这样的:https://192.168.3.19/view/video/video_p.html
先说一下我们最后的解决方案:
1.地址改为:
https://192.168.3.19:443/view/video/video_p.html
2.mWebView.setWebViewClient(new WebViewClient(){
    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        handler.proceed();
    }
});

下面我们讲一下历程
开始访问:
mWebView.loadUrl("https://192.168.3.19/view/video/video_p.html");
很自然的出错没商量,我们没有证书嘛!所以百度一下,要这样写:
mWebView.setWebViewClient(new WebViewClient(){
    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        handler.proceed();

    }
});
这样ssl加载出错的话会回调这个方法,嗯,理论上确实是这样!
但是实际上,却给我返回了这样一个错误:ERR_SSL_PROTOCOL_ERROR  
并且没有回调onReceivedSslError方法
然后又是一通百度,说是在5.0(api21)之后需要加这么一句话:
settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
试了之后没用!继续,StackOverFlow上说还要加这么两句:
settings.setUseWideViewPort(true);
settings.setLoadWithOverviewMode(true);
然并卵,这可咋整,所有的解决方法差不多都试了,没办法了,去看一下https吧,结果我就发现
他的端口和http不一样,不是80,而是443!坑爹啊,换了之后就好了。
当然,如果你的项目需要上线的话,那么步骤二建议这么写:
将下面代码复制到onReceivedSslError里,注意一定要将onReceivedSslError方法里本来的super.onReceivedSslError删除掉
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.webView.getContext());
  AlertDialog alertDialog = builder.create();
  String message = "Certificate error.";
  switch (error.getPrimaryError()) {
     case SslError.SSL_UNTRUSTED:
        message = "The certificate authority is not trusted.";
        break;
     case SslError.SSL_EXPIRED:
        message = "The certificate has expired.";
        break;
     case SslError.SSL_IDMISMATCH:
        message = "The certificate Hostname mismatch.";
        break;
     case SslError.SSL_NOTYETVALID:
        message = "The certificate is not yet valid.";
        break;
  }
  message += " Do you want to continue anyway?";
  alertDialog.setTitle("SSL Certificate Error");
  alertDialog.setMessage(message);
  alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() {

     public void onClick(DialogInterface dialog, int which) {
        Log.d("CHECK", "Button ok pressed");
        // Ignore SSL certificate errors
        handler.proceed();
     }
  });
  alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() {

     public void onClick(DialogInterface dialog, int which) {
        Log.d("CHECK", "Button cancel pressed");
        handler.cancel();
     }
  });
  alertDialog.show();


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值