CORS v JAX-RS
1. Prehľad
V tomto článku sa dozvieme, ako povoliť CORS (Zdieľanie zdrojov medzi krajinami) v JAX-RS založený systém. Aplikáciu nastavíme navrch JAX-RS umožniť CORS mechanizmus.
2. Ako povoliť mechanizmus CORS
Existujú dva spôsoby, ako môžeme povoliť CORS v JAX-RS. Prvým a najzákladnejším spôsobom je vytvoriť filter na vloženie potrebnej hlavičky odpovede za behu pri každej požiadavke. Druhou je manuálne pridanie príslušnej hlavičky do každého koncového bodu adresy URL.
V ideálnom prípade by sa malo použiť prvé riešenie; keď to však nie je možné, je aj manuálnejšia možnosť v poriadku.
2.1. Používanie filtra
JAX-RS má ContainerResponseFilter rozhranie - implementované filtrami odozvy kontajnera. Táto inštancia filtra sa zvyčajne aplikuje globálne na každú odpoveď HTTP.
Toto rozhranie implementujeme do vytvorenia vlastného filtra, ktorý sa vloží Access-Control-Allow- * hlavičku každej odchádzajúcej požiadavky a povoľte CORS mechanizmus:
@Provider verejná trieda CorsFilter implementuje ContainerResponseFilter {@Override public void filter (ContainerRequestContext requestContext, ContainerResponseContext responseContext) hodí 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, authorized"); responseContext.getHeaders (). add ("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD"); }}
Pár bodov tu:
- Implementácia filtrov ContainerResponseFilter musí byť výslovne anotovaný s @ Poskytovateľ byť objavený runtime JAX-RS
- Vstrekujeme ‘Access-Control-Allow- *„Hlavička s„ * “, to znamená, že k ľubovoľným koncovým bodom adresy URL tejto inštancie servera je možné získať prístup z ktorejkoľvek domény; ak chceme výslovne obmedziť prístup medzi doménami, musíme túto doménu spomenúť v tejto hlavičke
2.2. Použitie úpravy hlavičky do každého koncového bodu
Ako už bolo uvedené, môžeme explicitne vložiť „Access-Control-Allow- *„Hlavička aj na úrovni koncového bodu:
@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, authorized") .header ("Access-Control-Allow-Headers" Methods "," GET, POST, PUT, DELETE, OPTIONS, HEAD ") .entity (" ") .build (); }
Tu je potrebné poznamenať, ak sa pokúšame povoliť CORS vo veľkej aplikácii by sme túto metódu nemali skúšať, pretože v tomto prípade musíme ručne vložiť hlavičku do každého koncového bodu adresy URL, čo prinesie ďalšiu réžiu.
Túto techniku je však možné použiť v aplikáciách, kde to musíme povoliť CORS iba v niektorých koncových bodoch adresy URL.
3. Testovanie
Keď je aplikácia hore, môžeme hlavičky testovať pomocou príkazov zvlnenia. Výstup ukážkových hlavičiek by mal byť asi taký, ako je uvedený nižšie:
HTTP / 1.1 200 OK Dátum: Utorok, 13. mája 2014 12:30:00 GMT Pripojenie: keep-alive Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true Access-Control-Allow-Headers: origin , typ obsahu, prijať, autorizácia Metódy riadenia prístupu: Povoliť: ZÍSKAŤ, POST, PUT, ODSTRÁNENIE, MOŽNOSTI, Kódovanie prenosu HEAD: blok
Navyše môžeme vytvoriť jednoduchú funkciu AJAX a skontrolovať funkčnosť viacerých domén:
volanie funkcie (url, type, data) {var request = $ .ajax ({url: url, method: "GET", data: (data)? JSON.stringify (data): "", dataType: type}); request.done (funkcia (resp) {console.log (resp);}); request.fail (function (jqXHR, textStatus) {console.log ("Žiadosť zlyhala:" + textStatus);}); };
Samozrejme, aby sme kontrolu mohli skutočne vykonať, budeme ju musieť spustiť na inom pôvode ako API, ktoré spotrebúvame.
Môžete to urobiť lokálne celkom ľahko spustením klientskej aplikácie na samostatnom porte - pretože port určuje pôvod.
4. Záver
V tomto článku sme si ukázali o implementácii CORS mechanizmus v aplikáciách založených na JAX-RS.
Celý zdrojový kód je ako vždy k dispozícii na GitHub.