Webview:阻止JavaScript弹窗

11

目前,我正在使用以下代码行至少尝试通过JavaScriptwebview中阻止弹出窗口:

webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);

1)我不明白为什么我必须将此设置为"true"以使其起作用
2)是否有其他技术可用于阻止Webview中的弹出窗口?

非常感谢您的帮助。


setJavaScriptEnabled(boolean true/false); - IntelliJ Amiya
3个回答

5

前言

我们现在处于WebView的设置方面。
乍一看,这是一个显而易见的评论,但如果你不需要JavaScript不启用JavaScript,那么你就不会得到JavaScript弹出窗口。我假设你需要JavaScript(请记住它可能存在跨站脚本攻击漏洞),并希望尽你所能来禁用可能会随之而来的弹出窗口。

信息:

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);

1
你可以在WebChromeClient中尝试阻止弹出窗口(Windows)。
@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创建窗口(弹出窗口)的示例。


1

我必须这样做。在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;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接