Я хотел бы включить некоторые подсказки ресурсов предварительного соединения на моем сайте, чтобы браузеры могли (например) подключиться к jQuery CDN, прежде чем они действительно увидят тег script, который вызывает CDN. Я не уверен, должен ли я включать атрибут «crossorigin» или каково его значение. Спецификации говорят, в частности,
Чтобы инициировать предварительное соединение, пользовательский агент должен выполнить эти шаги:
[...]
- Пусть corsAttributeState будет текущим состоянием
crossorigin
атрибута содержимого элемента .- Пусть учетные данные будут логическим значением, установленным в
true
.- Если corsAttributeState имеет значение,
Anonymous
а origin не равен источнику текущего документа, установите учетные данные вfalse
.- Попытка получить связь с источником и учетными данными .
Я не знаю, как интерпретировать этот алгоритм. Если я предварительно подключусь к CDN, который позволит любому загружать его содержимое без каких-либо учетных данных, какое значение я должен использовать для атрибута «crossorigin»?
html
performance
cross-origin
bdesham
источник
источник
Ответы:
Я искал то же самое, и я нашел это
Здесь говорится, что если вы не используете атрибут кросс-происхождения, пользовательский агент просто выполняет поиск DNS, но не устанавливает соединение с конкретным доменом. Таким образом, атрибут crossorigin необходим, если вам нужно предварительно подключиться к кросс-домену, например так:
Также, если вы хотите отправить некоторые учетные данные в этот конкретный междоменный домен, вы можете установить значение для перекрестного поиска, так как в
crossorigin = use-credentials
противном случае я думаю, что значение по умолчанию является анонимным.источник
crossorigin
аналогичным образом приведет к потере соединения, поскольку должно быть открыто новое соединение, которое не использует CORS.До сих пор я понимаю использование
crossorigin
, особенно с точки зрения его значений,anonymous
иuse-credentials
вы должны использоватьcrossorigin="use-credentials"
в случае:В дополнение к цитируемой вами документации я получил то и это . Но на самом деле документация вводит в заблуждение и содержит орфографические ошибки: первая вызывает ее
use-credentials
, вторая -user-credentials
.Во всяком случае, в моем понимании:
crossorigin
на всех равныхcrossorigin="anonymous"
crossorigin
равноcrossorigin="use-credentials"
Может, кто-нибудь меня поправит.
PS : Текущая версия страницы Mozilla для темы означает:
Значит: нет
crossorigin
вообщеcrossorigin
илиcrossorigin="use_credentials"
все обрабатываются какcrossorigin="anonymous"
.источник
crossorigin
равнаcrossorigin="anonymous"
.Это зависит от двух вещей:
Для jQuery вы бы не использовали
crossorigin
. Скрипты не входят в число типов ресурсов, которые браузеры используют для загрузки .Шрифты, с другой стороны, используют CORS.
crossorigin
атрибут.crossorigin
. ЕслиВот сообщение о переполнении стека, где я столкнулся с той же проблемой.
Я не углублялся, когда необходимы учетные данные CORS. Я не видел пример, где они нужны, так что, скорее всего, вы в безопасности
crossorigin
(например, `crossorigin =" anonymous ").источник
Все ответы до сих пор кажутся либо упрощенными, неполными или частично неправильными (тема сложная, вещи смущенно названы и плохо документированы!), Так что вот мое понимание:
Чтобы иметь возможность повторно использовать созданное соединение
<link rel=preconnect>
, все зависит от того, какой тип контента вы хотите получить, откуда, будет ли запрос отправлять учетные данные браузера (которые могут быть установлены браузером явно или неявно):Запрос того же происхождения (
example.com
запрашивает субресурс изexample.com
)Во
preconnect
-первых , вообще не нужно ; браузер сохраняет соединение открытым после загрузки страницы в течение достаточно долгого времени. Если необходимо открыть несколько подключений, браузер сам решает, открывать ли и сколько (в зависимости от того, объявляет ли сервер поддержку HTTP / 2 при рукопожатии TLS, настройках браузера и т. Д.)Подлежит проверке : что если запрос того же источника имеет
crossorigin
атрибут: используется или игнорируется?Запрос перекрестного происхождения (
example.com
запрашивает субресурс изanother.com
)crossorigin
атрибут, явно установленный в HTML (crossOrigin
в JS - регистр важен), у предварительного соединения также должен быть его, с тем же значением (возможно, за исключением случаев, когда он не имеет смысла иcrossorigin
игнорируется - не полностью ясно для мне пока)<script type=module>
: будет проверено<img>
,<style type=stylesheet>
,<iframe>
, классический и<script>
т.д. (инициируемые с помощью HTML или JS) безcrossorigin
явно указанного , то preconnect не должен иметьcrossorigin
набор атрибутов.crossorigin=anonymous
fetch
илиXHR
:credentials !== omit
; в случаеwithCredentials === true
XHR:): предварительное соединение должно иметьcrossorigin=use-credentials
crossorigin=anonymous
В последнем случае (выборка / XHR) перейдите на сетевую панель в Chrome / Firefox devtools, щелкните правой кнопкой мыши запрос и выберите
copy as fetch
из выпадающего списка. Это создаст фрагмент JS, который скажет вам, является ли этот запрос CORS-enabled ("mode"=="cors"
) и credentialed ("credentials"=="include"|"same-origin"
).Однако обратите внимание, что вышеприведенный трюк не работает правильно для не-XHR / запросов выборки, потому что, например,
fetch
и<img>
использовать разные алгоритмы для установления соединения, как объяснено ранее.Наконец, в HTML
<link ...crossorigin>
===<link ...crossorigin=anonymous>
.Дополнительные заметки и ссылки:
источник