2017-02-10 45 views
1

目前我加载googleAds脚本从Omnifaces CDNResourceHandler至极产生Omnifaces推迟脚本CDNResourceHandler

<script type="text/javascript" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> 

现在,如果我尝试使用Omnifaces deferredScript与CDN资源处理程序加载相同的库,然后浏览器会显示消息

访问脚本“https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js”从 出身“https://xxxx”已被封锁的CORS政策:否 “访问控制允许来源”标题出现在请求的 资源中。

生成的HTML

<script type="text/javascript">OmniFaces.DeferredScript.add('https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js');</script> 

你能解释一下如何工作的呢? 它可以结合deferredScript和CDNResourceHandler的实用程序它看起来会产生CORS问题。如何解决它?

回答

1

你能解释一下为什么我们用deferredScript有这个CORS消息吗?

因为Omnifaces显然使用XHR从发出请求跨域请求由默认阻止XHR脚本跨来源和浏览器,但他们不会阻止跨域使用script

更新:请参阅BalusC的回答。从这个答案删除了上面的段落,因为Omnifaces使用XHR并不是真的。根据BalusC的回答,它会在script元素上设置crossorigin=anonymous,这也使得下面这个答案的大部分内容都不相关。


至于为什么浏览器处理XHR和script不同的跨域请求:

由于script芯首先被加入到HTML的时候,它已经允许嵌入脚本的网站之间的跨来源。但回想起来,如果我们再重复一次,我们不会这样设计,而是将其限制为仅用于包含来自相同原点的脚本。

但是,我们现在坚持使用script这种方式,因为如果我们要改变默认行为并将其设置为不起作用,那么它将破坏数百万个现有网站。


更新:有现在的script元素,如果使用的话会导致CORS给它以同样的方式发挥作用的script在多的XHR并取回crossorigin属性。


在通过时XHR加入到Web运行时间的对比,我们不得不回过头来看并设计它,以便它根本不跨域工作。因此,浏览器始终默认阻止任何使用XHR在Web应用程序中运行的JavaScript的跨请求请求。

随后,我们想出了CORS作为放松限制的一种方式:如果网站发送请求以发送CORS Access-Control-Allow-Origin响应标头以表明它选择接收跨源请求,那么浏览器将取消阻止该网站的跨网申请。

+0

您的第一段不正确。你究竟在源代码中看到了什么? – BalusC

+0

我从来没有看过源代码,但从你的答案我可以看到我错了,所以我会删除这个。感谢您打电话给我 – sideshowbarker

2

<o:deferredScript>永远不会用于外部资源。

您的技术问题是由于此标记explicitly设置crossorigin="anonymous"属性以支持脚本错误报告(以便将JavaScript错误发送到服务器端以进行日志记录)而引起的。未设置该属性时,您的具体问题将得到解决。

您可以report an issue to OmniFaces guys并告诉他们在脚本的src是外部时跳过该属性。现在,只需继续使用普通的<script>元素即可。您可以使用#{resource}让JSF根据库和名称生成所需的URL。

<script src="#{resource['cdn:adsbygoogle.js']}"> 

这允许在元素上手动设置async="true"属性的空间。

+0

感谢您的回复,但我尝试结合这些omnifaces实用程序优化googleAds加载。我可以用您的解决方案达到相同的结果吗? – jpl

+0