CORS в JAX-RS

1. Общ преглед

В тази кратка статия ще научим как да активирате CORS ( Cross-Origin Resource Sharing ) в JAX-RS базирана система. Ще настроим приложение върху JAX-RS, за да активираме механизма CORS .

2. Как да активирам механизма CORS

Има два начина, по които можем да активираме CORS в JAX-RS. Първият и най-основният начин е да се създаде филтър за инжектиране на необходимия заглавие на отговора по време на изпълнение във всяка заявка. Другият е да добавите ръчно подходящ хедър във всяка крайна точка на URL.

В идеалния случай трябва да се използва първото решение; обаче, когато това не е опция, по-ръчният вариант също е технически добре.

2.1. Използване на филтъра

JAX-RS има интерфейс ContainerResponseFilter - реализиран от филтрите за отговор на контейнера. Обикновено този екземпляр на филтъра се прилага глобално към всеки HTTP отговор.

Ще приложим този интерфейс, за да създадем персонализиран филтър, който ще инжектира заглавката Access-Control-Allow- * към всяка изходяща заявка и ще активира механизма CORS :

@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-Credentials", "true"); responseContext.getHeaders().add( "Access-Control-Allow-Headers", "origin, content-type, accept, authorization"); responseContext.getHeaders().add( "Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD"); } }

Няколко точки тук:

  • Филтрите, изпълняващи ContainerResponseFilter, трябва да бъдат изрично коментирани с @Provider, за да бъдат открити от изпълнението на JAX-RS
  • Инжектираме заглавката „ Access-Control-Allow- * “ с „*“, което означава, че всички крайни точки на URL към този екземпляр на сървъра могат да бъдат достъпни чрез всеки домейн; ако искаме да ограничим изрично кръстосания домейн, трябва да споменем този домейн в тази заглавка

2.2. Използване на промяна на заглавката във всяка крайна точка

Както беше посочено по-рано, можем изрично да инжектираме и заглавката „ Access-Control-Allow- * “ на ниво крайна точка:

@GET @Path("/") @Produces({MediaType.TEXT_PLAIN}) public Response index() { return Response .status(200) .header("Access-Control-Allow-Origin", "*") .header("Access-Control-Allow-Credentials", "true") .header("Access-Control-Allow-Headers", "origin, content-type, accept, authorization") .header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD") .entity("") .build(); }

Важно е да отбележим тук, че ако се опитваме да активираме CORS в голямо приложение, не бива да изпробваме този метод, защото в този случай трябва ръчно да инжектираме заглавката във всички крайни точки на URL, което ще въведе допълнителни режийни разходи.

Тази техника обаче може да се използва в приложения, където трябва да активираме CORS само в някои от крайните точки на URL адреса.

3. Тестване

След като приложението стартира, можем да тестваме заглавията, като използваме командите curl. Примерният изход на заглавките трябва да бъде нещо като по-долу:

HTTP/1.1 200 OK Date : Tue, 13 May 2014 12:30:00 GMT Connection : keep-alive Access-Control-Allow-Origin : * Access-Control-Allow-Credentials : true Access-Control-Allow-Headers : origin, content-type, accept, authorization Access-Control-Allow-Methods : GET, POST, PUT, DELETE, OPTIONS, HEAD Transfer-Encoding : chunked

Нещо повече, можем да създадем проста AJAX функция и да проверим междудоменната функционалност:

function call(url, type, data) { var request = $.ajax({ url: url, method: "GET", data: (data) ? JSON.stringify(data) : "", dataType: type }); request.done(function(resp) { console.log(resp); }); request.fail(function(jqXHR, textStatus) { console.log("Request failed: " + textStatus); }); };

Разбира се, за да извършим действително проверката, ще трябва да стартираме това на различен произход от API, който консумираме.

Можете да направите това локално доста лесно, като стартирате клиентско приложение на отделен порт - тъй като портът определя произхода.

4. Заключение

В тази статия показахме за прилагането на механизма CORS в приложения, базирани на JAX-RS.

Както винаги, пълният изходен код е достъпен в GitHub.