我正在编写一个 Android 应用程序,它托管一个 webview 来加载网页。我在 logcat 中遇到了很多如下错误:
拒绝执行内联脚本,因为它违反了以下规定 内容安全策略指令:“default-src 'self'”。注意 'script-src' 没有明确设置,因此 'default-src' 被用作 后备。
请注意,如果 Javascript 不是内联脚本,则它可以正常执行。 例如,使用如下所示的 HTML 文件:
<htnl>
<head>
<script type="text/javascript" src="abc.js"></script>
</head>
<body>
<script type="text/javascript">
alert("This is inline script");
</script>
</body>
</html>
abc.js中的脚本正常执行,但内联脚本被拒绝执行。
我了解到,由于“Contect Security Policy”,webview 拒绝执行内联 Javascript。但是网页需要执行这些内联脚本才能正常运行,并且我无法在网页上进行任何更改。
此问题仅KitKat (Android 4.4)
有没有办法克服这个问题,修改“内容安全策略”以允许执行内联脚本。
根据 WebView 开发人员的信息,注入的 javascript 在主机页面本身中运行,而不是像 Chromium 扩展那样在一个孤立的世界中运行。这就是为什么它们应该通过内容安全策略标头(如果存在)施加的常见安全检查。因此,不可能通过
src
属性或内联或以两种方式将脚本作为文件注入,具体取决于标头指令(例如,如果提到 unsafe-inline
,您将无法注入带有内联代码的脚本标签)。
解决方法是使用
loadUrl
或 evaluateJavascript
方法“按原样”执行 javascript 代码,而不添加脚本标签。例如:
webview.loadUrl("javascript:alert('hello')");
将会成功执行。
对于 Android 4.4 及更高版本,建议使用新的
evaluateJavascript
方法,因为当您的应用程序针对这些较新的 Android 版本之一时,loadUrl
会产生副作用(我认为现在大多数项目都是这种情况) :如果脚本返回一个值 - 它将替换当前页面的 DOM 内容。在 4.4 之前的目标上,两种方法都是相同的,除了可以通过 evaluateJavascript
中的可选回调返回值。
人们可以想到其他技巧,但这应该足以解决您的问题。
我有
拒绝应用内联样式,因为它违反了以下规定 内容安全策略指令:“default-src 'self'”。要么是 需要“unsafe-inline”关键字、哈希值或随机数(“nonce-...”) 启用内联执行。另请注意,“style-src”不是 显式设置,因此“default-src”用作后备。
并通过
解决了这个问题webView.settings.domStorageEnabled = true