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 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.
1 2 3 |
XMLHttpRequest cannot load https : //crunchify.com/api/test. No 'Access-Control-Allow-Origin' header is present on the requested resource . Origin 'null' is therefore not allowed access . |
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:
- Zrozumienie udostępniania zasobów między źródłami (filtry CORS)
- Czy mogę korzystać z udostępniania zasobów między źródłami?
- Jak włączyć udostępnianie zasobów między źródłami
- Co to jest Ajax międzydomenowy z udostępnianiem zasobów między źródłami
- 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.
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:
- Kontrola dostępu-Zezwól-Pochodzenie
- Metody kontroli dostępu
- Kontrola dostępu-maksymalny wiek
- Kontrola dostępu-Zezwól-Nagłówki
Kod filtra CORS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
package com . crunchify . tutorial ; /** * * @author Crunchify.com */ import com . sun . jersey . spi . container . ContainerRequest ; import com . sun . jersey . spi . container . ContainerResponse ; import com . sun . jersey . spi . container . ContainerResponseFilter ; import javax . ws . rs . core . Response ; import javax . ws . rs . core . Response . ResponseBuilder ; public class CrunchifyCORSFilter implements ContainerResponseFilter { public ContainerResponse filter ( ContainerRequest req , ContainerResponse crunchifyContainerResponse ) { ResponseBuilder crunchifyResponseBuilder = Response . fromResponse ( crunchifyContainerResponse . getResponse ( ) ) ; // *(allow from all servers) OR https://crunchify.com/ OR http://example.com/ crunchifyResponseBuilder . header ( "Access-Control-Allow-Origin" , "https://crunchify.com/" ) // As a part of the response to a request, which HTTP methods can be used during the actual request. . header ( "Access-Control-Allow-Methods" , "API, CRUNCHIFYGET, GET, POST, PUT, UPDATE, OPTIONS" ) // How long the results of a request can be cached in a result cache. . header ( "Access-Control-Max-Age" , "151200" ) // As part of the response to a request, which HTTP headers can be used during the actual request. . header ( "Access-Control-Allow-Headers" , "x-requested-with,Content-Type" ) ; String crunchifyRequestHeader = req . getHeaderValue ( "Access-Control-Request-Headers" ) ; if ( null ! = crunchifyRequestHeader && !crunchifyRequestHeader.equals(null)) { crunchifyResponseBuilder.header("Access-Control-Allow-Headers", crunchifyRequestHeader); } crunchifyContainerResponse . setResponse ( crunchifyResponseBuilder . build ( ) ) ; return crunchifyContainerResponse ; } } |
Modyfikacja w JerseyEmbeddedHTTPServerCrunchify.java z poprzedniego samouczka.

Wystarczy dodać poniższą linię w createHttpServer() i zrestartować serwer.
1 |
crunchifyResourceConfig . getContainerResponseFilters ( ) . add ( CrunchifyCORSFilter . class ) ; |
Wynik:
http://localhost:8085/api
Oto szczegóły nagłówków.
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
.
1 2 3 |
< IfModule mod_headers . c > Header set Access - Control - Allow - Origin "*" < / IfModule > |
Przykład-3: serwer .NET może to skonfigurować w web.config jak poniżej
1 2 3 4 5 6 |
< system . webServer > < httpProtocol > < customHeaders > < add name = "Access-Control-Allow-Origin" value = "your_clientside_websiteurl" / > < / customHeaders > < system . webServer > |
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
1 2 3 4 5 6 7 8 |
< filter > < filter - name > cross - origin < / filter - name > < filter - class > org . eclipse . jetty . servlets . CrossOriginFilter < / filter - class > < / filter > < filter - mapping > < filter - name > cross - origin < / filter - name > < url - pattern > /* < / url - pattern > < / filter - mapping > |
Przykład 5: Serwer Apache Tomcat (wersja 7.0.41 +)
1 2 3 4 5 6 7 8 |
< filter > < filter - name > CorsFilter < / filter - name > < filter - class > org . apache . catalina . filters . CorsFilter < / filter - class > < / filter > < filter - mapping > < filter - name > CorsFilter < / filter - name > < url - pattern > /* < / url - pattern > < / filter - mapping > |
Przykład-6: W PHP
1 2 3 |
<?php header ( "Access-Control-Allow-Origin: *" ) ; ?> |
Daj mi znać, jeśli masz więcej pytań na ten temat. Listę wszystkich samouczków Java znajdziesz tutaj.