CORS dans JAX-RS

1. Vue d'ensemble

Dans cet article rapide, nous allons découvrir comment activer CORS ( Cross-Origin Resource Sharing ) dans un système basé sur JAX-RS . Nous allons configurer une application au-dessus de JAX-RS pour activer le mécanisme CORS .

2. Comment activer le mécanisme CORS

Il existe deux façons d'activer CORS dans JAX-RS. La première et la plus simple consiste à créer un filtre pour injecter l'en-tête de réponse nécessaire au moment de l'exécution dans chaque requête. L'autre consiste à ajouter manuellement un en-tête approprié dans chaque point de terminaison d'URL.

Idéalement, la première solution doit être utilisée; cependant, lorsque ce n'est pas une option, l'option la plus manuelle est également technique.

2.1. Utilisation du filtre

JAX-RS a l' interface ContainerResponseFilter - implémentée par les filtres de réponse du conteneur. En règle générale, cette instance de filtre est appliquée globalement à toute réponse HTTP.

Nous implémenterons cette interface pour créer un filtre personnalisé qui injectera l'en - tête Access-Control-Allow- * à chaque requête sortante et activera le mécanisme CORS :

@Provider public class CorsFilter implements ContainerResponseFilter { @Override public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { responseContext.getHeaders().add( "Access-Control-Allow-Origin", "*"); responseContext.getHeaders().add( "Access-Control-Allow-Credentials", "true"); responseContext.getHeaders().add( "Access-Control-Allow-Headers", "origin, content-type, accept, authorization"); responseContext.getHeaders().add( "Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD"); } }

Quelques points ici:

  • Les filtres implémentant ContainerResponseFilter doivent être explicitement annotés avec @Provider pour être découverts par le runtime JAX-RS
  • Nous injectons l'en - tête ' Access-Control-Allow- * ' avec '*', ce qui signifie que tous les points de terminaison d'URL de cette instance de serveur sont accessibles via n'importe quel domaine; si nous voulons restreindre explicitement l'accès interdomaine, nous devons mentionner ce domaine dans cet en-tête

2.2. Utilisation de la modification d'en-tête dans chaque point de terminaison

Comme indiqué précédemment, nous pouvons également injecter explicitement l'en - tête ' Access-Control-Allow- * ' au niveau du point de terminaison:

@GET @Path("/") @Produces({MediaType.TEXT_PLAIN}) public Response index() { return Response .status(200) .header("Access-Control-Allow-Origin", "*") .header("Access-Control-Allow-Credentials", "true") .header("Access-Control-Allow-Headers", "origin, content-type, accept, authorization") .header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD") .entity("") .build(); }

Un point à noter ici est que si nous essayons d'activer CORS dans une grande application, nous ne devrions pas essayer cette méthode car dans ce cas, nous devons injecter manuellement l'en-tête dans chaque point de terminaison d'URL, ce qui introduira une surcharge supplémentaire.

Cependant, cette technique peut être utilisée dans les applications, où nous devons activer CORS uniquement dans certains des points de terminaison d'URL.

3. Test

Une fois l'application lancée, nous pouvons tester les en-têtes à l'aide des commandes curl. Un exemple de sortie d'en-têtes devrait être quelque chose comme ci-dessous:

HTTP/1.1 200 OK Date : Tue, 13 May 2014 12:30:00 GMT Connection : keep-alive Access-Control-Allow-Origin : * Access-Control-Allow-Credentials : true Access-Control-Allow-Headers : origin, content-type, accept, authorization Access-Control-Allow-Methods : GET, POST, PUT, DELETE, OPTIONS, HEAD Transfer-Encoding : chunked

De plus, nous pouvons créer une fonction AJAX simple et vérifier la fonctionnalité interdomaine:

function call(url, type, data) { var request = $.ajax({ url: url, method: "GET", data: (data) ? JSON.stringify(data) : "", dataType: type }); request.done(function(resp) { console.log(resp); }); request.fail(function(jqXHR, textStatus) { console.log("Request failed: " + textStatus); }); };

Bien sûr, pour effectuer la vérification, nous devrons l'exécuter sur une origine différente de celle de l'API que nous consommons.

Vous pouvez le faire localement assez facilement en exécutant une application cliente sur un port séparé - puisque le port détermine l'origine.

4. Conclusion

Dans cet article, nous avons montré comment implémenter le mécanisme CORS dans les applications basées sur JAX-RS.

Comme toujours, le code source complet est disponible à l'adresse over sur GitHub.