Co to jest współużytkowanie zasobów między źródłami (CORS) — jak dodać je do serwera internetowego Java Jersey?

Opublikowany: 2014-07-19

Samouczek dotyczący udostępniania zasobów między źródłami (CORS) autorstwa Crunchify

Jak naprawić ten błąd podczas komunikacji client-server ? Serwer wysyła dane w formacie JSON lub XML, a klient zgłasza poniżej wyjątek.

Zwykłe strony internetowe mogą używać obiektu XMLHttpRequest do wysyłania i odbierania danych z serwerów zdalnych, ale są one ograniczone przez tę samą zasadę pochodzenia. Rozszerzenia nie są tak ograniczone. Rozszerzenie może komunikować się ze zdalnymi serwerami spoza swojego źródła, o ile najpierw zażąda uprawnień między źródłami.

Ponadto, jeśli masz poniższe pytania, jesteś we właściwej lokalizacji:

  1. Zrozumienie udostępniania zasobów między źródłami (filtry CORS)
  2. Czy mogę korzystać z udostępniania zasobów między źródłami?
  3. Jak włączyć udostępnianie zasobów między źródłami
  4. Co to jest Ajax międzydomenowy z udostępnianiem zasobów między źródłami
  5. Co to jest kontrola dostępu HTTP (CORS)

CORS (Cross Origin Resource Sharing) to mechanizm obsługiwany przez W3C, który umożliwia żądania krzyżowego pochodzenia w przeglądarkach internetowych. CORS wymaga wsparcia zarówno przeglądarki, jak i serwera. Jest to implementacja filtru CORS po stronie serwera Java Jersey Web Server dla kontenerów internetowych, takich jak Apache Tomcat i inne wbudowane serwery internetowe.

Przykład serwera Crunchify CORSFilter Jersey

Krok 1:

Odpowiedź może zawierać nagłówek Access-Control-Allow-Origin z pochodzeniem, z którego pochodzi żądanie, jako wartością, aby umożliwić dostęp do zawartości zasobu. Agent użytkownika sprawdza, czy wartość i pochodzenie, z którego pochodzi żądanie, są zgodne.

Krok 2:

Programy użytkownika mogą za pomocą żądania wstępnego sprawdzania, czy zasób między źródłami jest przygotowany do akceptowania żądań, przy użyciu nieprostej metody, z danego źródła. Jest to ponownie sprawdzane przez agenta użytkownika.

Krok 3:

Aplikacje po stronie serwera mogą wykryć, że żądanie HTTP zostało uznane za żądanie cross-origin przez agenta użytkownika, poprzez nagłówek Origin. To rozszerzenie umożliwia aplikacjom po stronie serwera wymuszanie ograniczeń (np. niczego nie zwracających) żądań między źródłami, które chcą obsłużyć.

Teraz zacznijmy od przykładów.

Przykład-1: Serwer WWW Java Jersey

Kilka tygodni temu napisałem artykuł na temat Jak uruchomić osadzony serwer HTTP Jersey podczas uruchamiania aplikacji Java. Ten post obejmuje kroki, jak dodać filtr CORS do tego samego serwera Jersey.

Musimy rozszerzyć ContainerResponseFilter. Interfejs zaimplementowany przez filtry odpowiedzi kontenera. Domyślnie, tj. jeśli żadne powiązanie nazwy nie jest stosowane do klasy implementacji filtru, instancja filtru jest stosowana globalnie do każdej wychodzącej odpowiedzi.

Aby to naprawić spróbujmy dodać poniższe 4 nagłówki do odpowiedzi serwera:

  1. Kontrola dostępu-Zezwól-Pochodzenie
  2. Metody kontroli dostępu
  3. Kontrola dostępu-maksymalny wiek
  4. Kontrola dostępu-Zezwól-Nagłówki

Kod filtra CORS:

Modyfikacja w JerseyEmbeddedHTTPServerCrunchify.java z poprzedniego samouczka.

Wystarczy dodać poniższą linię w createHttpServer() i zrestartować serwer.

Wynik:

http://localhost:8085/api

Crunchify nagłówek odpowiedzi z filtrem CORS

Oto szczegóły nagłówków.

Crunchify nagłówek odpowiedzi bez filtra CORS

Przykład-2: Serwer HTTP Apache

Aby odsłonić nagłówek, możesz dodać następujący wiersz w sekcjach <Directory>, <Location> i <Files> lub w pliku .htaccess .

Przykład-3: serwer .NET może to skonfigurować w web.config jak poniżej

Przykład-4: Dla molo (7 i więcej)

Dołącz plik JAR jetty-servlet do swojego WEB-INF/lib i włącz go do swojego WEB-INF/web.xml

Przykład 5: Serwer Apache Tomcat (wersja 7.0.41 +)

Przykład-6: W PHP

Daj mi znać, jeśli masz więcej pytań na ten temat. Listę wszystkich samouczków Java znajdziesz tutaj.