CORS dans JAX-RS
1. Vue d'ensemble
Dans cet article rapide, nous allons découvrir comment activerCORS (Cross-Origin Resource Sharing) dans un système basé surJAX-RS. Nous allons configurer une application en plus deJAX-RS pour activer le mécanismeCORS.
2. Comment activer le mécanisme CORS
Il est possible d'activer CORS de deux manières différentes dans JAX-RS. La première et la plus fondamentale 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 noeud final 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 possède l'interfaceContainerResponseFilter - 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 allons implémenter cette interface pour créer un filtre personnalisé qui injectera l'en-têteAccess-Control-Allow-* à chaque requête sortante et activera le mécanismeCORS:
@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émentantContainerResponseFilter 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'activerCORS 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 des aérien.
Cependant, cette technique peut être utilisée dans les applications, où nous devons activerCORS uniquement dans certains des points de terminaison d'URL.
3. Essai
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 ressembler à ceci:
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é -since the port does determine the origin.
4. Conclusion
Dans cet article, nous avons montré comment implémenter le mécanismeCORS dans les applications basées sur JAX-RS.
Comme toujours, le code source complet est disponibleover on GitHub.