关于WebView的常见问题

本文详细介绍了Android WebView在不同场景下的高级配置技巧,包括解决Http与Https混合内容加载问题、WebView闪烁、缩放引起的崩溃、外部JS攻击防范、以及WebViewClient与WebChromeClient的区别与使用场景。
摘要由CSDN通过智能技术生成

1、Android 5.0 WebView中Http和Https混合内容

  1.1 在Android5.0 中WebView默认不允许加载Http、Https混合内容,解决办法如下:

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); }

     MIXED_CONTENT_ALWAYS_ALLOW:允许从任何来源加载内容,即使起源是不安全的;

  MIXED_CONTENT_NEVER_ALLOW:不允许Https加载Http的内容,即不允许从安全的起源去加载一个不安全的资源;

  MIXED_CONTENT_COMPATIBILITY_MODE:当涉及到混合式内容时,WebView 会尝试去兼容最新Web浏览器的风格。

1.2 设置WebView接收所有网站证书

      webView.setWebViewClient(new WebViewClient() {

            @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {

                // handler.cancel();// Android默认的处理方式

               handler.proceed();// 接受所有网站的证书

             // handleMessage(Message msg);// 进行其他处理

        }

   });

结束的时候直接System.exit(0)退出当前进程

2、WebView闪烁问题,解决如下

 webView.setLayerType(View.LAYER_TYPE_SOFTWARE,null);

3、缩放引起的崩溃

webSettings.setDisplayZoomControls(true);为设置了允许进行缩放,这个缩放按钮会在出现后几秒消失,在部分系统里,如果在按钮消失前退出Activity,会导致系统崩溃,解决办法就是 将webSettings.setDisplayZoomControls(false),如果需要显示缩放按钮,就需要在Activity退出的时候,在onDesctory里进行销毁webView

4、Android 版本大于17的,

调用JS webSettings.setJavaScriptEnabled(true);需要加注解 
@SuppressLint("SetJavaScriptEnabled")

5、外部JS攻击 

  由于应用中的WebView没有对file:///类型的url做限制,可能导致外部攻击者利用Javascript代码读取本地隐私数据。

5.1 如果WebView不需要使用file协议,直接禁用所有与file协议相关的功能即可(不影响对assets和resources资源的加载)。

//如果WebView不需要使用file协议,直接禁用所有与file协议相关的功能即可(不影响对assets和resources资源的加载)
//进行如下三个设置即可
webSettings.setAllowFileAccess(false);
webSettings.setAllowFileAccessFromFileURLs(false);
webSettings.setAllowUniversalAccessFromFileURLs(false);

5.2 如果WebView需要使用file协议,则应该禁用file协议的Javascript功能。具体方法为:在调用loadUrl方法前,以及在shouldOverrideUrlLoading方法中判断url的scheme是否为file。如果是file协议,就禁用Javascript,否则启用Javascript。

//调用loadUrl前
if("file".equals(Uri.parse(url).getScheme())){//判断是否为file协议
      webView.getSettings().setJavaScriptEnabled(false);
   }else{
      webView.getSettings().setJavaScriptEnabled(true);
   }


webView.loadUrl(url);

   //WebViewClient中做的操作
   @Override
   public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
      if("file".equals(request.getUrl().getScheme())){//判断是否为file协议
         view.getSettings().setJavaScriptEnabled(false);
      }else{
         view.getSettings().setJavaScriptEnabled(true);
      }
      return false;
   }

6、WebViewClient 和 WebChromeClient 区别

      在WebView设计中不是所有的都需要WebView干的,比如一些设置就需要WebSettings处理,WebView专心干好解析渲染工作,在使用WebView加载资源过程中,可能会有大量各种类型事件的回调,为了方便开发组处理这些回调,针对不同的事件回调,google将这些回调进行了分类集合,于是就产生了WebViewClient、WebChromeClient这两个大类。

这两大类有什么区别呢?

简单来说就是

  • WebViewClient:在影响【View】的事件到来时,会通过WebViewClient中的方法回调通知用户
  • WebChromeClient:当影响【浏览器】的事件到来时,就会通过WebChromeClient中的方法回调通知用法。

实际使用的话,如果你的WebView只是用来处理一些html的页面内容,只用WebViewClient就行了,如果需要更丰富的处理效果,比如JS、进度条等,就要用到WebChromeClient。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值