目前,我正在使用以下代码行至少尝试通过JavaScript
在webview
中阻止弹出窗口:
webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
1)我不明白为什么我必须将此设置为"true"以使其起作用
2)是否有其他技术可用于阻止Webview中的弹出窗口?
非常感谢您的帮助。
目前,我正在使用以下代码行至少尝试通过JavaScript
在webview
中阻止弹出窗口:
webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
1)我不明白为什么我必须将此设置为"true"以使其起作用
2)是否有其他技术可用于阻止Webview中的弹出窗口?
非常感谢您的帮助。
我们现在处于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
来自@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);
@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创建窗口(弹出窗口)的示例。
我必须这样做。在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;
}
}
setJavaScriptEnabled(boolean true/false);
- IntelliJ Amiya