XMLHttpRequest cannot load http://localhost:8080/api/test. Origin http://localhost:3000 is not allowed by Access-Control-Allow-Origin.
Czytałem o zapytaniach AJAX między domenami i rozumiem podstawowy problem z bezpieczeństwem. W moim przypadku 2 serwery działają lokalnie i lubią włączać żądania międzydomenowe podczas testowania.
localhost:8080 - Google Appengine dev server
localhost:3000 - Node.js server
Wystawiam żądanie AJAX do, localhost:8080 - GAE server
gdy moja strona jest ładowana z serwera węzła. Co jest najłatwiejsze i najbezpieczniejsze (nie chcę uruchamiać chrome z disable-web-security
opcją). Jeśli muszę zmienić 'Content-Type'
, czy powinienem to zrobić na serwerze węzła? W jaki sposób?
Odpowiedzi:
Ponieważ działają na różnych portach, są to różne JavaScript
origin
. Nie ma znaczenia, że są na tej samej maszynie / nazwie hosta.Musisz włączyć CORS na serwerze (localhost: 8080). Sprawdź tę witrynę: http://enable-cors.org/
Wszystko, co musisz zrobić, to dodać nagłówek HTTP do serwera:
Lub dla uproszczenia:
Nie należy używać znaku „*”, jeśli serwer próbuje ustawić plik cookie, a Ty używasz
withCredentials = true
Możesz przeczytać więcej o tym
withCredentials
tutajźródło
Access-Control-Allow-Origin
nagłówek musi być nagłówkiem dodanym do odpowiedzi HTTP wysyłanych przez serwer. Ten nagłówek musi być częścią odpowiedzi serwera, nie musi być częścią żądania klienta . W szczególności dzieje się, zanim klient wyśle żądane żądanie , przeglądarka wysyłaOPTIONS
żądanie przed nim, a jeśli odpowiedź serwera na toOPTIONS
żądanie nie zawiera nagłówka, przeglądarka nie wyśle żądanego żądania.Jeśli potrzebujesz szybkiego obejścia w Chrome dla żądań Ajax, ta wtyczka Chrome automatycznie umożliwia dostęp do dowolnej witryny z dowolnego źródła, dodając odpowiedni nagłówek odpowiedzi
Rozszerzenie Chrome Allow-Control-Allow-Origin: *
źródło
Musisz włączyć CORS, aby rozwiązać ten problem
jeśli Twoja aplikacja została utworzona za pomocą prostego node.js.
ustaw go w nagłówkach odpowiedzi, takich jak
jeśli Twoja aplikacja została utworzona w ramach ekspresowej platformy
użyj oprogramowania pośredniczącego CORS, takiego jak
i aplikuj przez
Oto dwa linki referencyjne
źródło
config.allowedDomains
. powiedz w moim przypadku, jakie URI mam tam umieścić?*
lub, dospecific domain
którego chcesz przyznać dostęp.app.configure()
to nie błąd funkcji?Akceptuję odpowiedź @Rocket Hazmat, która prowadzi mnie do rozwiązania. Rzeczywiście musiałem ustawić nagłówek na serwerze GAE. Musiałem to ustawić
ustawienie
"Access-Control-Allow-Origin"
dawało tylko błądPonadto, jeśli trzeba wysłać token uwierzytelniania, dodaj to również
Również u klienta ustawione
withCredentials
powoduje to wysłanie 2 żądań do serwera, w tym jednego z
OPTIONS
. Plik cookie uwierzytelniający nie jest wysyłany wraz z nim, dlatego należy traktować uwierzytelnianie zewnętrzne.źródło
W routerze.js po prostu dodaj kod przed wywołaniem metod get / post. U mnie działa bezbłędnie.
źródło
Miałem problem podczas wywoływania zasobów pochodzących z innych źródeł przy użyciu AJAX z Chrome.
Użyłem node js i lokalnego serwera http do wdrożenia mojej aplikacji node js.
Otrzymałem odpowiedź o błędzie podczas uzyskiwania dostępu do zasobu między źródłami
Znalazłem na to jedno rozwiązanie,
1) Dodałem poniższy kod do mojego pliku app.js.
2) Na mojej stronie html o nazwie cross-origin resource using
$.getJSON();
źródło
Jeśli korzystasz z usługi Express, możesz użyć oprogramowania pośredniego cors w następujący sposób:
źródło
Dodaj to do swojego serwera NodeJS poniżej importu:
źródło
Jeśli po tym otrzymałeś 403, zredukuj filtry w konfiguracji tomcat WEB.XML do następującego:
źródło
W końcu dostałem odpowiedź na apache Tomcat8
Musisz edytować plik tomcat web.xml.
prawdopodobnie będzie w folderze webapps,
znajdź go i edytuj
Umożliwi to dostęp-kontrolę-zezwolenie-pochodzenia wszystkim hostom. Jeśli chcesz zmienić go ze wszystkich hostów na tylko swój host, możesz edytować plik
powyższy kod od * do adresu http: // your_public_IP lub http://www.example.com
możesz odwołać się tutaj dokumentacji filtra Tomcat
Dzięki
źródło
Cześć To jest sposób na rozwiązanie problemu CORS w węźle Po prostu dodaj te linie po stronie "api" serwera w Node.js (lub jakimkolwiek pliku serwera), zanim to upewnij się, że zainstalowałeś "cors"
źródło
użyj typu dataType: „jsonp”, działa dla mnie.
źródło
W przypadku PHP użyj tego do ustawienia nagłówków.
źródło
dodaj to do swoich tras, do których dzwonisz z front-endu. Np. Jeśli wywołujesz http: // localhost: 3000 / users / register , musisz dodać ten fragment kodu do pliku .js zaplecza, który tworzy ta trasa.
źródło
Jeśli ktoś szuka rozwiązania, jeśli korzystasz z ekspresu, to szybkie rozwiązanie.
1) zainstaluj przewody za pomocą npm
npm install cors --save
2) zaimportuj [wymagaj]
const cors = require('cors')
3) używać go jako oprogramowania pośredniego
app.use(cors())
aby uzyskać szczegółowe informacje, wstaw i zastosowanie cors . To jest to, mam nadzieję, że działa.
źródło
Jeśli korzystasz z przeglądarki Google Chrome, spróbuj zainstalować ten dodatek:
https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi/related
źródło