【问题标题】:Webview: block JavaScript popupsWebview:阻止 JavaScript 弹出窗口
【发布时间】:2017-11-28 11:29:50
【问题描述】:

现在我正在使用这行代码至少尝试在webview 中阻止JavaScript 的弹出窗口:

webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);

1) 我不明白为什么我必须将其切换为“真实”它正在工作
2) 还有其他技术可以阻止 webview 中的弹出窗口吗?

非常感谢您的帮助。

【问题讨论】:

  • setJavaScriptEnabled(boolean true/false);

标签: javascript android webview block overlays


【解决方案1】:

序言

我们处于等式的WebView 设置一边。
乍一看很明显的评论,但如果你不需要JavaScript不要启用 JavaScript,那么你不会得到JavaScript 弹出窗口。我假设你确实需要JavaScript(记住它可能XSS vulnerable)并且想做你能做的 禁用 不可避免的弹出窗口。

信息

WebViewClient。覆盖 WebView 的这种行为,例如所以链接在您的WebView 中打开。 WebChromeClient 可让您处理 Javascript's alert() 和其他功能。
OP(1)setJavaScriptCanOpenWindowsAutomatically(true)通常被阻止 事件处理程序之外完成。
OP = 原帖;O)

让我们设置一个场景

这就是我设置普通webview的方式:

WebView webView = (WebView) this.findViewById(R.id.webView1);//CustomWebView ?

WebSettings webView_settings = webView.getSettings();

//by setting a WebClient to catch javascript's console messages :

WebChromeClient webChromeClient = new WebChromeClient() {
        public boolean onConsoleMessage(ConsoleMessage cm) {
            Log.d(TAG, cm.message() + " -- From line "
                    + cm.lineNumber() + " of "
                    + cm.sourceId() );
            return true;
        }
    });
webView_settings.setDomStorageEnabled(true);

WebViewClient webViewClient = new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            setTitle(view.getTitle());
            //do your stuff ...
            }
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.startsWith("file")) 
        {
            // Keep local assets in this WebView.
             return false;
        }
      }
    });

//webView.setWebViewClient(new HelpClient(this));//
webView.setWebChromeClient(webChromeClient);
webView.setWebViewClient(webViewClient);
webView.clearCache(true);
webView.clearHistory();
webView_settings.setJavaScriptEnabled(true);//XSS vulnerable set to false ?
webView_settings.setJavaScriptCanOpenWindowsAutomatically(true);//set to false ?
webView.loadUrl("file:///android_asset/connect.php.html");//load something

OP(2) 让我们尽可能阻止

来自@markproxy 如果您扩展WebChromeClient,您可以覆盖其onJsAlert() 方法并阻止内置的警报处理程序。 当您使用它时,您可能希望阻止对confirm()prompt() 的调用:

WebChromeClient webChromeClient = new WebChromeClient() {
    @Override
    public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
        result.cancel();
        return true;
    }

    @Override
    public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
        result.cancel();
        return true;
    }

    @Override
    public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
        result.cancel();
        return true;
    }
};

webView.setWebChromeClient(webChromeClient);

【讨论】:

    【解决方案2】:

    您可以尝试在 WebChromeClient 中阻止弹出窗口(窗口):

    @Override
    public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
        WebView newWebView = (WebView) LayoutInflater.from(view.getContext()).inflate(R.layout.webview_custom_view, null);
        WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
        transport.setWebView(newWebView);
        resultMsg.sendToTarget();
        return true;
    }
    

    对象 newWebView 应该像视图一样添加到一些容器中。这是从 WebView 创建窗口(弹出窗口)的示例。

    【讨论】:

      【解决方案3】:

      我必须这样做。覆盖 WebChromeClient 类中的 onJSAlert() 方法:

      MyWebChromeClient myWebChromeClient = new MyWebChromeClient();
      webView.setWebChromeClient(myWebChromeClient);
      

      MyWebChromeClient 是一个继承 WebChromeClient

      的自定义类
      public class MyWebChromeClient extends WebChromeClient {
      
          @Override
          public boolean onJsAlert(WebView view, String url, String message, JsResult result)
          {
              final JsResult finalRes = result;
              new AlertDialog.Builder(view.getContext())
                  .setMessage(message)
                  .setPositiveButton(android.R.string.ok,
                          new AlertDialog.OnClickListener()
                          {
                              @Override
                              public void onClick(DialogInterface dialog, int which) {
                                  finalRes.confirm();  
                              }
                          })
                  .setCancelable(false)
                  .create()
                  .show();
              return true;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多