Ce este Partajarea resurselor între origini (CORS) – Cum să o adaugi la serverul tău web Java Jersey?
Publicat: 2014-07-19 Cum se remediază această eroare în timpul comunicării client-server
? Serverul trimite date în format JSON sau XML și clientul aruncă sub excepție.
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 . |
Paginile web obișnuite pot folosi obiectul XMLHttpRequest pentru a trimite și a primi date de la servere la distanță, dar sunt limitate de aceeași politică de origine. Extensiile nu sunt atât de limitate. O extensie poate vorbi cu servere de la distanță în afara originii sale, atâta timp cât solicită mai întâi permisiuni între origini.
De asemenea, dacă aveți întrebări de mai jos, vă aflați în locația corectă:
- Înțelegerea partajării resurselor între origini (filtre CORS)
- Pot folosi Partajarea resurselor între origini
- Cum să activați partajarea resurselor între origini
- Ce este Ajax între domenii cu partajarea resurselor între origini
- Ce este controlul accesului HTTP (CORS)
CORS (Cross Origin Resource Sharing) este un mecanism suportat de W3C pentru a activa cererile de origine încrucișată în browserele web. CORS necesită suport atât de la browser, cât și de la server pentru a funcționa. Aceasta este o implementare a filtrului Java Jersey Web Server a CORS pe partea de server pentru containere web, cum ar fi Apache Tomcat și alte servere web încorporate.
Pasul 1:
Un răspuns poate include un antet Access-Control-Allow-Origin, cu originea de unde provine cererea ca valoare, pentru a permite accesul la conținutul resursei. Agentul utilizator validează că valoarea și originea de unde a provenit cererea se potrivesc.
Pasul 2:
Agenții utilizatori pot descoperi printr-o solicitare preflight dacă o resursă cu origini încrucișate este pregătită să accepte cereri, utilizând o metodă non-simple, de la o anumită origine. Acest lucru este din nou validat de agentul utilizator.
Pasul 3:
Aplicațiile de pe partea serverului sunt activate pentru a descoperi că o solicitare HTTP a fost considerată o solicitare între origini de către agentul utilizator, prin antetul Origine. Această extensie permite aplicațiilor de pe partea serverului să impună limitări (de exemplu, să nu returneze nimic) cererilor de origine încrucișată pe care sunt dispuse să le dea servicii.
Acum să începem cu Exemple.
Exemplul-1: Server Web Java Jersey
Cu câteva săptămâni în urmă, am scris un articol despre Cum să porniți serverul Embedded HTTP Jersey în timpul pornirii aplicației Java. Această postare va acoperi pașii despre cum să adăugați filtrul CORS la același server Jersey.
Trebuie să extindem ContainerResponseFilter. Interfață implementată de filtrele de răspuns ale containerului. În mod implicit, adică dacă nu este aplicată nicio legătură de nume pentru clasa de implementare a filtrului, instanța de filtru este aplicată global oricărui răspuns de ieșire.
Pentru ca acest lucru să se remedieze, să încercăm să adăugăm mai jos 4 anteturi la răspunsul serverului:
- Acces-Control-Permite-Origine
- Acces-Control-Permite-Metode
- Acces-Control-Max-Age
- Acces-Control-Permite-anteturi
Cod filtru 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 ; } } |
Modificare în JerseyEmbeddedHTTPServerCrunchify.java din tutorialul anterior.

Doar adăugați linia de mai jos în createHttpServer() și reporniți serverul.
1 |
crunchifyResourceConfig . getContainerResponseFilters ( ) . add ( CrunchifyCORSFilter . class ) ; |
Rezultat:
http://localhost:8085/api
Iată detalii despre anteturi.
Exemplul-2: Apache HTTP Server
Pentru a expune antetul, puteți adăuga următoarea linie în secțiunile <Directory>, <Location> și <Files> sau într-un fișier .htaccess
.
1 2 3 |
< IfModule mod_headers . c > Header set Access - Control - Allow - Origin "*" < / IfModule > |
Exemplul-3: Serverul .NET poate configura acest lucru în web.config, după cum urmează
1 2 3 4 5 6 |
< system . webServer > < httpProtocol > < customHeaders > < add name = "Access-Control-Allow-Origin" value = "your_clientside_websiteurl" / > < / customHeaders > < system . webServer > |
Exemplul-4: pentru Jetty (7 și mai sus)
Includeți JAR-ul de servlet-uri în WEB-INF/lib și îmbinați-l în 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 > |
Exemplul-5: Server Apache Tomcat (v 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 > |
Exemplul-6: În PHP
1 2 3 |
<?php header ( "Access-Control-Allow-Origin: *" ) ; ?> |
Vă rog să-mi spuneți dacă mai aveți întrebări despre asta. Lista tuturor tutorialelor Java va fi găsită aici.