CORS (CrossOriginResourceSharing) est un mécanisme normalisé par le W3C permettant à un navigateur (compatible) d'effectuer des requêtes cross-domain (cross-origin).
Par exemple, une page HTML dont l'origine est http://www.hardis-group contenant un script qui exécute une requête vers un service REST dont l'URL est http://www.hardis.services/ws/client?id=3.
Cf $Référenceshttp://blog.inovia-conseil.fr/?p=202 pour une explication détaillée du mécanisme.

 

La problématique CORS doit être découplée de l'écriture des services REST.
L'application hébergeant les services doit, par configuration (filtre:javax.servlet.filter), accepter ou rejeter les requêtes qui lui sont adressées dans le contexte CORS.
Si la  requête est  acceptée, la réponse est construite par le service REST invoqué puis est automatiquement enrichie (par le filtre) avec les headers CORS ad'hoc issus de la configuration du filtre.

Sous tomcat, le plus simple est de déclarer et de configurer le CORSFilter fourni en standard (depuis la version 7.0.42).

Dans le fichier web.xml de l'application hébergeant les services REST, il faut ajouter la déclaration du filtre et de ses paramètres (ceux pour lesquels les valeurs sont différentes des valeurs par défaut).

Par exemple :

Exemple CORSFilter
 <filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
  <init-param>
    <param-name>cors.allowed.origins</param-name>
    <param-value>*</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.methods</param-name>
    <param-value>GET,POST,HEAD,OPTIONS,PUT,DELETE</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.headers</param-name>   
    <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization</param-value>
  </init-param>
  <init-param>
    <param-name>cors.support.credentials</param-name>
    <param-value>true</param-value>
  </init-param>
  <init-param>
    <param-name>cors.preflight.maxage</param-name>
    <param-value>1800</param-value>
  </init-param>
</filter>

...

<filter-mapping>
  <filter-name>CorsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>


Détail des paramètres du filtre

cors.allowed.origins : Liste des origines qui sont autorisées à accéder à la ressource. * permet d'accepter toutes les origines.
Exemple : http://www.hardis-group1.com, https://www.hardis-local.com:8080
Défaut : *

cors.allowed.methods : Liste des méthodes HTTP autorisées pour accéder à la ressource dans le cadre des requêtes 'cross-origin'.
Exemple: GET, POST
Défaut: GET, POST, HEAD, OPTIONS

cors.allowed.headers : Liste des headers de requêtes autorisés.
Exemple : Origin, Accept
Défaut : Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers
Remarque : Dans le cas d'une requête 'pre-flight', les headers autorisés sont retournés dans le header Access-Control-Allow-Headers de la réponse 'pre-flight'.

cors.exposed.headers : Liste des headers de réponse (autres que les headers 'simple') pouvant être accédés par le navigateur.
Exemple: X-CUSTOM-HEADER-PING,X-CUSTOM-HEADER-PONG
Défaut : Aucun
Remarque : Dans le cas d'une requête pre-flight, les headers en question sont retournés dans le header Access-Control-Expose-Headers  de la réponse 'pre-flight'.

cors.preflight.maxage : Temps (secondes) accordé au navigateur pour conserver en cache la réponse d'une requête 'pre-flight'.
Une valeur négative désactive l'utilisation du cache.
Exemple: 3200
Défaut: 1800

cors.support.credentials : Permet d'autoriser ou non la propagation des cookies, vecteurs d'accréditation et certificats SSL.
Défaut: true

Note : Les éléments des listes sont toujours séparés par une virgule.


IMPORTANT :
- Pour l'utilisation d'un jeton JWT passé via le header Authorization, il faut ajouter Authorization dans la liste cors.allowed.headers
- Pour l'utilisation des services via HTTPS, cors.support.credentials doit être à true (défaut). Il faut également, côté client (javascript), fixer la propriété withCredentials de l’objet XMLHttpRequest à true.

(V13 PTF9)

A partir de la version V13 PTF09, il est possible d'associer/d'ajouter une configuration CORS à la définition d'un élément  <jaxrs:server> dans le fichier de configuration beans.xml.
Exemple :

<jaxrs:server id="RestAdelia" address="/" transportId="http://cxf.apache.org/transports/http">
   <jaxrs:properties>
      <entry key="CorsDefinition">             
         <map>
            <entry key="Allow-Origin" value="*"/>
            <entry key="Allow-Methods" value="GET,POST"/>
            <entry key="Allow-Headers" value="Content-Type, Authorization"/>
         </map>
      </entry>
   </jaxrs:properties>
</jaxrs:server>  




Références :
http://blog.inovia-conseil.fr/?p=202
https://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#CORS_Filter
https://developer.mozilla.org/fr/docs/HTTP/Access_control_CORS

 

  • Aucune étiquette