Che cos'è la condivisione delle risorse tra origine (CORS) - Come aggiungerla al server Web Java Jersey?
Pubblicato: 2014-07-19 Come correggere questo errore durante la comunicazione client-server
? Il server invia i dati in formato JSON o XML e il client genera un'eccezione al di sotto.
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 . |
Le normali pagine Web possono utilizzare l'oggetto XMLHttpRequest per inviare e ricevere dati da server remoti, ma sono limitate dalla stessa policy di origine. Le estensioni non sono così limitate. Un'estensione può comunicare con server remoti al di fuori della sua origine, a condizione che prima richieda autorizzazioni multiorigine.
Inoltre, se hai domande di seguito, sei nella posizione corretta:
- Comprensione della condivisione delle risorse tra origini (filtri CORS)
- Posso usare la condivisione delle risorse tra le origini
- Come abilitare la condivisione delle risorse tra le origini
- Che cos'è Ajax tra domini con condivisione delle risorse tra le origini
- Che cos'è il controllo di accesso HTTP (CORS)
CORS (Cross Origin Resource Sharing) è un meccanismo supportato dal W3C per abilitare le richieste cross-origine nei browser web. CORS richiede il supporto sia del browser che del server per funzionare. Questa è un'implementazione del filtro del server Web Jersey Java di CORS lato server per contenitori Web come Apache Tomcat e altri server Web incorporati.
Passo 1:
Una risposta può includere un'intestazione Access-Control-Allow-Origin, con l'origine dell'origine della richiesta come valore, per consentire l'accesso al contenuto della risorsa. L'interprete convalida che il valore e l'origine di dove ha avuto origine la richiesta corrispondano.
Passo 2:
I programmi utente possono scoprire tramite una richiesta di preflight se una risorsa multiorigine è pronta ad accettare richieste, utilizzando un metodo non semplice, da una determinata origine. Questo viene nuovamente convalidato dall'agente utente.
Passaggio 3:
Le applicazioni lato server sono abilitate a scoprire che una richiesta HTTP è stata considerata una richiesta multiorigine dall'agente utente, tramite l'intestazione Origin. Questa estensione consente alle applicazioni lato server di imporre limitazioni (ad es. non restituendo nulla) alle richieste tra origini che sono disposte a soddisfare.
Ora iniziamo con gli esempi.
Esempio-1: Server Web Jersey Java
Un paio di settimane fa ho scritto un articolo su Come avviare il server Jersey HTTP incorporato durante l'avvio dell'applicazione Java. Questo post tratterà i passaggi su come aggiungere il filtro CORS allo stesso server Jersey.
Dobbiamo estendere ContainerResponseFilter. Interfaccia implementata dai filtri di risposta del contenitore. Per impostazione predefinita, ovvero se non viene applicata alcuna associazione del nome alla classe di implementazione del filtro, l'istanza del filtro viene applicata globalmente a qualsiasi risposta in uscita.
Affinché ciò si risolva, proviamo ad aggiungere sotto 4 intestazioni alla risposta del server:
- Accesso-Controllo-Consenti-Origine
- Metodi di controllo accessi
- Access-Control-Max-Età
- Access-Control-Allow-Headers
Codice filtro 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 ; } } |
Modifica in JerseyEmbeddedHTTPServerCrunchify.java dal tutorial precedente.

Basta aggiungere la riga sottostante in createHttpServer() e riavviare il server.
1 |
crunchifyResourceConfig . getContainerResponseFilters ( ) . add ( CrunchifyCORSFilter . class ) ; |
Risultato:
http://localhost:8085/api
Ecco i dettagli delle intestazioni.
Esempio-2: Server HTTP Apache
Per esporre l'intestazione, puoi aggiungere la seguente riga all'interno delle sezioni <Directory>, <Posizione> e <File> o all'interno di un file .htaccess
.
1 2 3 |
< IfModule mod_headers . c > Header set Access - Control - Allow - Origin "*" < / IfModule > |
Esempio-3: il server .NET può configurarlo in web.config come di seguito
1 2 3 4 5 6 |
< system . webServer > < httpProtocol > < customHeaders > < add name = "Access-Control-Allow-Origin" value = "your_clientside_websiteurl" / > < / customHeaders > < system . webServer > |
Esempio-4: Per Jetty (7 e oltre)
Includi il JAR del jetty-servlet in WEB-INF/lib e uniscilo al tuo 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 > |
Esempio-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 > |
Esempio-6: In PHP
1 2 3 |
<?php header ( "Access-Control-Allow-Origin: *" ) ; ?> |
Per favore fatemi sapere se avete altre domande su questo. L'elenco di tutti i tutorial Java si trova qui.