L’origine n’est pas autorisée par Access-Control-Allow-Origin – comment activer CORS en utilisant une stack Web et un guice très simples

Je ne suis pas sûr que le problème concerne les technologies impliquées ou ma compréhension des technologies.

J’ai une application html5 écrite en javascript et HTML, hébergée sur un serveur Apache 2.2.

J’ai une application java écrite en java utilisant jetty, guice, jackson, jersey qui héberge un simple service REST.

Les deux applications s’exécutent sur la même boîte, une sur le port 80 (application html5 pure hébergée sur apache), l’autre sur 8080 (application Java pure hébergée sur une jetée / un guice)

Je crois que la réponse est dans les en-têtes im renvoyant. Les en-têtes CORS indiquent à un navigateur que vous autorisez les applications externes à atteindre votre API. Je n’arrive pas à comprendre comment configurer mon serveur Jetty, Guice pour renvoyer les en-têtes CORS corrects.

J’utilise un serveur Jetty intégré, donc je n’ai pas de fichier web.xml avec lequel append les en-têtes.

Cela peut également être lié à la manière dont le serveur d’application HTML5 (dans ce cas, apache 2.2) est au service de l’application.

Le fichier apache httpd.conf a pour entrée:

LoadModule headers_module modules/mod_headers.so  Header add Access-Control-Allow-Origin "*" Header add Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE, HEAD Header add Access-Control-Allow-Headers: X-PINGOTHER Header add Access-Control-Max-Age: 1728000  

Dans ma configuration de servlet de guice, j’ai les éléments suivants:

 public class RestModule extends ServletModule{ @Override protected void configureServlets() { bind(QuestbookService.class); // hook Jersey into Guice Servlet bind(GuiceContainer.class); // hook Jackson into Jersey as the POJO  JSON mapper bind(JacksonJsonProvider.class).in(Scopes.SINGLETON); Map guiceContainerConfig = new HashMap(); guiceContainerConfig.put(ResourceConfig.PROPERTY_RESOURCE_FILTER_FACTORIES, HttpStatusCodeMesortingcResourceFilterFactory.class.getCanonicalName()); serve("/*").with(GuiceContainer.class, guiceContainerConfig); } } 

Je pense que le problème est dans ma configuration de guice puisque je n’ai pas de place pour définir les en-têtes de réponse.

J’utilise un serveur embarqué intégré et j’ai donc pensé que le mode dev contournerait tout le contrôle, mais je peux me tromper.

Merci pour tout conseil.

Faites pour les exigences spécifiques de mon application. Le serveur doit être complètement séparé du client. Le client doit pouvoir se connecter au serveur de communication par n’importe quelle méthode.

Étant donné que la première implémentation de cette application va être pilotée par REST, je dois pouvoir accepter le repos de n’importe où.

De plus, je veux une configuration complète sans xml, donc j’utilise Guice avec un serveur Jetty intégré. Comme je n’ai pas de fichier web.xml, je n’ai pas pu déterminer comment définir les en-têtes pour autoriser CORS.

Après beaucoup d’essais et d’erreurs, et après avoir lu la documentation du guice, j’ai trouvé comment append les en-têtes CORS à la réponse sortant du serveur.

La classe Guice ServletModule vous permet d’append des filtres à votre contexte de servlet. Cela me permet de faire passer toutes les requêtes via un servlet donné.

Comme j’essaie de créer une application de repos qui répond aux requêtes CORS, j’avais besoin d’un filtre qui ajoutait les en-têtes cors à la réponse de toute requête. En ce moment, il répond à toutes les demandes, mais finalement je ne répondrai que si la couche de service répond avec un code de réponse 200 – 300.

Donc, pour activer les cors dans mon serveur embarqué en utilisant guice, j’ai construit un filtre qui ressemble à ceci:

 @Singleton public class CorsFilter implements Filter{ @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { if(response instanceof HttpServletResponse){ HttpServletResponse alteredResponse = ((HttpServletResponse)response); addCorsHeader(alteredResponse); } filterChain.doFilter(request, response); } private void addCorsHeader(HttpServletResponse response){ //TODO: externalize the Allow-Origin response.addHeader("Access-Control-Allow-Origin", "*"); response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, HEAD"); response.addHeader("Access-Control-Allow-Headers", "X-PINGOTHER, Origin, X-Requested-With, Content-Type, Accept"); response.addHeader("Access-Control-Max-Age", "1728000"); } @Override public void destroy() {} @Override public void init(FilterConfig filterConfig)throws ServletException{} } 

Guice fournit une classe abstraite qui vous permet de configurer le Servlet Guice.

Le module de configuration ressemble à ceci:

 public class RestModule extends ServletModule{ @Override protected void configureServlets() { bind(MyServiceClass.class); // hook Jersey into Guice Servlet bind(GuiceContainer.class); // hook Jackson into Jersey as the POJO <-> JSON mapper bind(JacksonJsonProvider.class).in(Scopes.SINGLETON); Map guiceContainerConfig = new HashMap(); serve("/*").with(GuiceContainer.class, guiceContainerConfig); filter("/*").through(CorsFilter.class); } } 

Maintenant, guice va append des en-têtes à chaque réponse. Permettre à mon application HTML 5 pure de lui parler, peu importe où elle est diffusée.

Il suffit de mettre une ligne dans votre fichier de code

response.addHeader (“Access-Control-Allow-Origin”, “*”);

Remplacez * avec votre http://www.votresite.com si vous souhaitez autoriser uniquement un domaine particulier