Wszystkie dotychczasowe odpowiedzi wydają się uproszczone, niekompletne lub częściowo błędne (temat jest złożony, rzeczy są myląco nazwane i niezbyt dobrze udokumentowane!), Oto moje rozumienie:
Aby móc ponownie użyć połączenia utworzonego przez <link rel=preconnect>, wszystko zależy od tego, jaki rodzaj treści chcesz pobrać, skąd, czy żądanie wyśle dane uwierzytelniające przeglądarki (które mogą być ustanowione przez przeglądarkę jawnie lub niejawnie):
Żądanie ma to samo pochodzenie ( example.comżądania z pod -źródłaexample.com )
Po pierwsze, wcale nie ma takiej potrzeby preconnect; przeglądarka utrzymuje połączenie otwarte po ładowaniu strony przez dłuższy czas. Jeśli istnieje wiele połączeń do otwarcia, przeglądarka sama decyduje, czy i ile otworzyć (w zależności od tego, czy serwer ogłasza obsługę HTTP / 2 w uzgadnianiu TLS, ustawieniach przeglądarki itp.)
do sprawdzenia : co jeśli crossoriginatrybut tego samego pochodzenia ma atrybut: czy jest używany czy ignorowany?
Żądanie pochodzi z różnych źródeł ( example.comżądania z pod -źródłaanother.com )
- jeśli rzeczywiste żądanie ma jawnie ustawiony
crossorigin atrybut w HTML ( w JS - ważna jest wielkość liter), musi też mieć to połączenie wstępne o tej samej wartości (być może z wyjątkiem przypadków, w których nie ma to sensu i jest ignorowane - nie do końca jasne ja jeszcze)crossOrigincrossorigin
- w przeciwnym razie, jeśli wniosek, jeśli
<script type=module>: do sprawdzenia
- indziej, jeśli wniosek jest i „starej szkoły” zapytanie
<img>, <style type=stylesheet>, <iframe>, klasyczne <script>itp (inicjowane poprzez HTML lub JS) bez crossoriginwyraźnie określonej , wówczas wstępne łączenie nie może mieć crossoriginzestaw atrybutów.
- w przeciwnym razie, jeśli żądanie jest żądaniem czcionki pochodzącej z innego źródła , połączenie wstępne musi mieć
crossorigin=anonymous
- w przeciwnym razie, jeśli wniosek jest źródłem krzyżowym
fetch lub XHR:
- jeśli odbywa się to w trybie uwierzytelnienia (tzn. pliki cookie są dołączone lub używane jest podstawowe uwierzytelnianie HTTP; w przypadku pobierania oznacza to
credentials !== omit; w przypadku XHR withCredentials === true:): połączenie wstępne musi miećcrossorigin=use-credentials
- jeśli nie jest w trybie uwierzytelnienia: połączenie wstępne musi mieć
crossorigin=anonymous
W ostatnim przypadku (fetch / XHR) przejdź do panelu sieciowego w devtools Chrome / Firefox, kliknij prawym przyciskiem myszy żądanie i wybierz copy as fetchz menu rozwijanego. Spowoduje to utworzenie fragmentu kodu JS, który poinformuje Cię, czy to żądanie obsługuje CORS ( "mode"=="cors") i jest poświadczone ( "credentials"=="include"|"same-origin").
Uwaga jednak podstęp powyżej nie działa poprawnie dla non-XHR / pobrać wnioski, bo na przykład fetchi <img>używać różnych algorytmów do ustanowienia połączenia, jak wyjaśniono wcześniej.
Wreszcie w HTML <link ...crossorigin>=== <link ...crossorigin=anonymous>.
Dodatkowe uwagi i linki: