Che cos'è la condivisione delle risorse tra origine (CORS) - Come aggiungerla al server Web Java Jersey?

Pubblicato: 2014-07-19

Esercitazione CORS (Cross-Origin Resource Sharing) di Crunchify

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.

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:

  1. Comprensione della condivisione delle risorse tra origini (filtri CORS)
  2. Posso usare la condivisione delle risorse tra le origini
  3. Come abilitare la condivisione delle risorse tra le origini
  4. Che cos'è Ajax tra domini con condivisione delle risorse tra le origini
  5. 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.

Crunchify CORSFilter Esempio di server Jersey

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:

  1. Accesso-Controllo-Consenti-Origine
  2. Metodi di controllo accessi
  3. Access-Control-Max-Età
  4. Access-Control-Allow-Headers

Codice filtro CORS:

Modifica in JerseyEmbeddedHTTPServerCrunchify.java dal tutorial precedente.

Basta aggiungere la riga sottostante in createHttpServer() e riavviare il server.

Risultato:

http://localhost:8085/api

Intestazione di risposta Crunchify con filtro CORS

Ecco i dettagli delle intestazioni.

Intestazione di risposta Crunchify senza filtro CORS

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 .

Esempio-3: il server .NET può configurarlo in web.config come di seguito

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

Esempio-5: Server Apache Tomcat (v 7.0.41 +)

Esempio-6: In PHP

Per favore fatemi sapere se avete altre domande su questo. L'elenco di tutti i tutorial Java si trova qui.