Cross-origin resource sharing, a Java EE
Tworząc aplikację w architekturze klient-serwer, gdzie klient korzysta z serwisów udostępnianych przez serwer w innej domenie, zazwyczaj pojawia się problem ze współdzieleniem zasobów pomiędzy domenami. Chcąc wykonać żądanie AJAX do innej domeny, możliwe jest wykorzystanie mechanizmu CORS (Cross-origin resource sharing).
CORS pozwala na udostępnienie serwerowi zasobów dla klientów z określonej domeny. Aby móc wykorzystać ten mechanizm, musi być on obsłużony przez przeglądarkę (większość współczesnych przeglądarek implementuje go) oraz serwer.
Chcąc udostępnić zasoby przez serwer, wystarczy dodać odpowiednie nagłówki do odpowiedzi dla klienta. Dla aplikacji pisanej z wykorzystaniem Javy EE sprowadza się to do dodania odpowiedniego filtru. Przykładowe minimalistyczne rozwiązanie:
import java.io.IOException;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;
@Provider
public class CorsFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
responseContext.getHeaders().add("Access-Control-Allow-Origin", "*");
responseContext.getHeaders().add("Access-Control-Allow-Headers", "content-type");
}
}
Nagłówek “Access-Control-Allow-Origin” określa pochodzenie żądania, które jest dozwolone. Z kolei “Access-Control-Allow-Headers” jest istotny dla tzw. podglądanych żądań (preflighted requests - żądanie poprzedzone wywołaniem żądania OPTIONS sprawdzającego obsługę CORS wykonywane przez przeglądarkę) i ogranicza nagłówki, które mogą zostać użyte w zapytaniu.
Po więcej szczegółów odsyłam do dokumentacji, która opisuje szczegółowo wszystkie możliwe nagłówki i możliwości wykorzystania mechanizmu CORS.
Przykładowy filtr: