Qu'est-ce que le partage de ressources cross-origin (CORS) - Comment l'ajouter à votre serveur Web Java Jersey ?
Publié: 2014-07-19 Comment corriger cette erreur lors de la communication client-server
? Le serveur envoie des données au format JSON ou XML et le client renvoie l'exception ci-dessous.
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 . |
Les pages Web ordinaires peuvent utiliser l'objet XMLHttpRequest pour envoyer et recevoir des données à partir de serveurs distants, mais elles sont limitées par la même politique d'origine. Les extensions ne sont pas si limitées. Une extension peut communiquer avec des serveurs distants en dehors de son origine, tant qu'elle demande d'abord des autorisations inter-origines.
De plus, si vous avez les questions ci-dessous, vous êtes au bon endroit :
- Présentation du partage de ressources cross-origin (filtres CORS)
- Puis-je utiliser le partage de ressources cross-origin
- Comment activer le partage de ressources cross-origin
- Qu'est-ce qu'Ajax inter-domaines avec le partage de ressources cross-origin
- Qu'est-ce que le contrôle d'accès HTTP (CORS)
CORS (Cross Origin Resource Sharing) est un mécanisme pris en charge par le W3C pour activer les demandes d'origine croisée dans les navigateurs Web. CORS nécessite la prise en charge du navigateur et du serveur pour fonctionner. Il s'agit d'une implémentation de filtre Java Jersey Web Server de CORS côté serveur pour les conteneurs Web tels qu'Apache Tomcat et d'autres serveurs Web intégrés.
Étape 1:
Une réponse peut inclure un en-tête Access-Control-Allow-Origin, avec l'origine d'où provient la demande comme valeur, pour autoriser l'accès au contenu de la ressource. L'agent utilisateur valide que la valeur et l'origine de l'origine de la demande correspondent.
Étape 2:
Les agents utilisateurs peuvent découvrir via une demande de contrôle en amont si une ressource d'origine croisée est prête à accepter des demandes, en utilisant une méthode non simple, d'une origine donnée. Ceci est à nouveau validé par l'agent utilisateur.
Étape 3:
Les applications côté serveur sont activées pour découvrir qu'une demande HTTP a été considérée comme une demande d'origine croisée par l'agent utilisateur, via l'en-tête Origin. Cette extension permet aux applications côté serveur d'appliquer des limitations (par exemple, ne rien retourner) sur les requêtes d'origine croisée qu'elles sont prêtes à traiter.
Commençons maintenant avec les exemples.
Exemple-1 : Serveur Web Java Jersey
Il y a quelques semaines, j'ai écrit un article sur Comment démarrer le serveur HTTP Jersey intégré lors du démarrage de l'application Java. Cet article couvrira les étapes sur la façon d'ajouter le filtre CORS au même serveur Jersey.
Nous devons étendre ContainerResponseFilter. Interface implémentée par des filtres de réponse de conteneur. Par défaut, c'est-à-dire si aucune liaison de nom n'est appliquée à la classe d'implémentation de filtre, l'instance de filtre est appliquée globalement à toute réponse sortante.
Pour résoudre ce problème, essayons d'ajouter ci-dessous 4 en-têtes à la réponse du serveur :
- Accès-Contrôle-Autoriser-Origine
- Access-Control-Allow-Méthodes
- Access-Control-Max-Age
- Access-Control-Allow-Headers
Code de filtre 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 ; } } |
Modification dans JerseyEmbeddedHTTPServerCrunchify.java du tutoriel précédent.

Ajoutez simplement la ligne ci-dessous dans createHttpServer() et redémarrez le serveur.
1 |
crunchifyResourceConfig . getContainerResponseFilters ( ) . add ( CrunchifyCORSFilter . class ) ; |
Résultat:
http://localhost:8085/api
Voici un détail des en-têtes.
Exemple-2 : Serveur HTTP Apache
Pour exposer l'en-tête, vous pouvez ajouter la ligne suivante dans les sections <Directory>, <Location> et <Files>, ou dans un fichier .htaccess
.
1 2 3 |
< IfModule mod_headers . c > Header set Access - Control - Allow - Origin "*" < / IfModule > |
Exemple-3 : le serveur .NET peut le configurer dans web.config comme ci-dessous
1 2 3 4 5 6 |
< system . webServer > < httpProtocol > < customHeaders > < add name = "Access-Control-Allow-Origin" value = "your_clientside_websiteurl" / > < / customHeaders > < system . webServer > |
Exemple-4 : Pour Jetty (7 et plus)
Incluez le JAR jetty-servlets dans votre WEB-INF/lib et fusionnez-le dans votre 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 > |
Exemple-5 : Serveur 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 > |
Exemple-6 : En PHP
1 2 3 |
<?php header ( "Access-Control-Allow-Origin: *" ) ; ?> |
N'hésitez pas à me faire savoir si vous avez d'autres questions à ce sujet. La liste de tous les didacticiels Java se trouve ici.