Android webview拒绝执行内联脚本
Android webview refused to execute inline script
我正在编写一个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中的脚本可以正常执行,但是内联脚本被拒绝执行。
我理解webview拒绝执行内联Javascript由于"内容安全策略"。但是网页需要执行这些内联脚本才能正常工作,我不能在网页上做任何改变。
此问题仅适用于KitKat (Android 4.4)
是否有办法克服这个问题,修改"内容安全策略"以允许内联脚本执行
根据WebView开发人员的信息,注入的javascript在主机页面本身运行,而不是像Chromium扩展那样在一个孤立的世界中运行。这就是为什么它们应该通过内容安全策略头(如果存在的话)强加的常见安全检查的原因。因此,根据头指令,通过src
属性或内联或两种方式注入脚本作为文件是不可能的(例如,如果提到unsafe-inline
,您将无法注入带有内联代码的脚本标记)。
解决方法是使用loadUrl
或evaluateJavascript
方法来执行javascript代码"按原样",而不添加脚本标签。例如:
webview.loadUrl("javascript:alert('hello')");
将被成功执行。
对于Android 4.4及以上,建议使用新的evaluateJavascript
方法,因为loadUrl
有一个副作用,当你的应用程序是针对这些较新的Android版本之一(我认为这是大多数项目的情况下):如果脚本返回一个值-它将取代当前页面的DOM内容。在4.4之前的目标上,这两个方法是相同的,除了可能通过evaluateJavascript
中的可选回调返回一个值。
你可以想到其他的技巧,但这应该足以解决你的问题。
- ajax加载了内容,脚本没有执行
- 当页面中的某些脚本已经执行时,javascript回调
- Jquery延迟脚本的执行
- 拒绝执行内联事件处理程序,因为它违反了CSP.(沙盒)
- 为什么这个脚本不执行scrollTo(x,y)javascript
- Modernizr.load 回调在加载脚本之前执行
- 如何在脚本中执行函数
- JS - 延迟脚本的执行,直到所有数据都已定义/可用
- 当我在火狐扩展中使用页面模组添加内容脚本时.内容脚本函数执行三次
- 使用脚本定期执行 mysql 查询
- 内容脚本未执行
- JavaScript 脚本不执行
- 创建一个动态HTML文件并在Google Apps脚本中执行它
- 应用了头 js,但脚本不执行
- Javascript BlackJack 脚本不执行/调用 “hitMe()” 和 “stand()” 函数与 Mozi
- 通过 ajax 调用多个脚本.只有在脚本 1 完成执行后,才应调用脚本 2
- 防止脚本在执行时运行两次
- 使用自定义警报框暂停脚本的执行
- Android webview拒绝执行内联脚本
- avoid alert拒绝执行JavaScript脚本.在请求中找到的脚本源代码