要启动预连接,用户代理必须运行以下步骤:
[…]
让corsAttributeState为元素的
crossorigin
内容属性的当前状态。让凭据为设置为
true
的布尔值。如果corsAttributeState为
Anonymous
且origin不等于当前Document的原点,将凭据设置为false
。尝试获取与来源和凭据的连接。
我不知道如何解释该算法。如果我要预连接CDN,这样任何人都可以下载CDN的内容而无需任何种类的凭据,那么“ crossorigin”属性应使用什么值?
#1 楼
我在搜索相同的内容,发现了这个问题它在这里指出,如果您不使用跨源属性,则用户代理只会进行dns查找,但不会与特定域建立连接。因此,如果必须预先连接到跨域,则需要crossorigin属性,例如:
<link rel="preconnect" href="https://fonts.gstatic.com/" crossorigin>
此外,如果要将一些凭据发送到该特定的跨域,则可以设置要交叉赋值为
crossorigin = use-credentials
的值,否则我认为默认值为匿名。评论
这是半正确的。如果使用CORS(与字体一样),则仅DNS查找将与字体请求一起使用。 (该连接仍然发生,但未在瀑布图中显示,因为必须为CORS请求打开一个单独的连接。)如果要获取脚本,则使用交叉源同样会浪费连接,因为必须打开一个新连接不使用CORS。
– Michael Crenshaw
19年4月30日在20:28
#2 楼
到目前为止,我了解crossorigin
的用法,尤其是就其值anonymous
和use-credentials
而言,在以下情况下应使用crossorigin="use-credentials"
:您使用资产,例如图像或视频, crossorigin属性
,您计划根据用户代理以前与源的交互,在源之间携带cookie,HTTP身份验证和客户端SSL证书。
此外,您引用的文档中我知道这个。但是确实该文档具有误导性并且包含拼写错误:第一个称为
use-credentials
,第二个称为user-credentials
。无论如何,据我了解:否
crossorigin
全部等于crossorigin="anonymous"
crossorigin
等于crossorigin="use-credentials"
也许有人会纠正我。
PS:当前版本在主题的Mozilla页面中:
无效的关键字和空字符串将作为匿名关键字处理。
方法:否
crossorigin
完全将crossorigin
或crossorigin="use_credentials"
处理为crossorigin="anonymous"
。评论
我相信,正如MDN中提到的那样,默认情况下(即未指定属性时),根本不使用CORS。同样,仅设置crossorigin等于crossorigin =“ anonymous”。
–莎士比亚
19-3-22在13:23
#3 楼
它取决于两件事:要下载的资产类型(确定是否使用CORS)
目标服务器是否对CORS连接使用凭据
对于jQuery,您不会使用
crossorigin
。脚本不在浏览器使用CORS下载的资源类型中。字体则使用CORS。
如果页面仅获取使用CORS的资源,请包括
crossorigin
属性。 如果页面仅获取不使用CORS的资源,请省略
crossorigin
。如果如果页面将同时获取两种资源,则可能需要两个资源提示。 (完全公开,链接到我的个人网站。:-))有人指出,HTTP / 2可能不需要两个提示。我没有时间进行测试。
这是我遇到相同问题的Stack Overflow帖子。
当需要使用CORS凭据时,我还没有深入研究。我还没有看到需要它们的示例,因此您可以安全地使用
crossorigin
(即`crossorigin =“ anonymous”)。#4 楼
到目前为止,所有答案似乎都是简化的,不完整的或部分错误的(主题很复杂,事物的名称令人迷惑并且没有充分记录!),因此,我的理解是:为了能够重用创建的连接通过
<link rel=preconnect>
,事情取决于您要从哪种类型的内容中获取内容,该请求是否将发送浏览器凭据(可以由浏览器显式或隐式地建立):请求是相同的-origin(
example.com
从example.com
请求子资源)根本不需要
preconnect
; 如果要打开多个连接,浏览器将自行决定是否打开以及打开多少个连接(取决于服务器是否在TLS中宣布HTTP / 2支持)握手,浏览器设置等)。
:如果同源请求具有
crossorigin
属性,该属性是被使用还是被忽略?请求是跨源的(
example.com
请求来自another.com
的子资源)如果实际请求具有在HTML中明确设置的crossorigin
属性(在JS中为crossOrigin
,则很重要),则预连接也必须具有相同的值(也许除了在没有意义且忽略了crossorigin
的情况下-尚不完全清楚)否则,如果要求
<script type=module>
:要检查否则,如果请求是“老派”请求,则
<img>
,<style type=stylesheet>
,<iframe>
,经典<script>
等(通过HTML或JS发起),而没有crossorigin
explici 否则,如果请求是跨域字体请求,则预连接必须具有
crossorigin
其他,如果请求是跨域字体请求
crossorigin=anonymous
或fetch
:如果是以凭据模式完成的(即附加了cookie或使用HTTP基本身份验证;则在获取时表示
XHR
;对于XHR:credentials !== omit
):预连接必须具有withCredentials === true
不在凭据模式下:预连接必须具有
crossorigin=use-credentials
对于最后一种情况(fetch / XHR),请转到Chrome / Firefox devtools中的网络面板,右键单击一个请求,然后从下拉列表中选择
crossorigin=anonymous
。这将创建一个JS代码段,该代码段将告诉您该请求是否已启用CORS(copy as fetch
)和凭据("mode"=="cors"
)。请注意,但是上述技巧不适用于非XHR / fetch请求,因为例如
"credentials"=="include"|"same-origin"
和fetch
使用不同的算法来建立连接,如前所述。最后,在HTML中,
<img>
=== <link ...crossorigin>
。其他说明和链接:
在Firefox中,即使应该进行预连接也不起作用
三种检查预连接是否起作用的方法
浏览器具有一些功能限制可以发生多少个并行DNS请求
在WebPageTest上使用自定义脚本注入进行预连接的实验
评论
相关:stackoverflow.com/questions/55520102/…