2017-08-16 8 views
0

'Access-Control-Allow-Origin je besoin d'accéder à mon api web hébergé à distance de mon application réagir. Du côté du serveur je l'ai fait ci-dessous pour permettre la communication inter-domaine:incapable de mettre en-tête

import javax.ws.rs.core.Response; 
import com.mypackage.ResponseDto; 

@Override 
public Response fetch(String id, String env) throws ServiceException 
{ 
    ResponseDto res = new ResponseDto(); 
    res = updateResp(id, env); // not important 

    return Response.ok().header("Access-Control-Allow-Origin","*").entity(res).build(); 
} 

Quand je vérifie de postier je peux voir en-tête Set correctement CORS comme ci-dessous:

access-control-allow-origin →* 
content-type →application/json 
date →Wed, 16 Aug 2017 11:07:16 GMT 
server →web 
transfer-encoding →chunked 

Mais quand j'accéder au même point final de réagir app, les navigateurs commence à se plaindre avec l'erreur ci-dessous:

Fetch API cannot load http://myservices.com/myservice-app/services/ . Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin ' http://localhost:3000 ' is therefore not allowed access. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled

Toute idée ce qui se passe ici?

Edit # 1 Avez-dessous le changement voir toujours la même erreur:

return Response.ok() 
      .header("Access-Control-Allow-Origin", "*") 
      .header("Access-Control-Allow-Methods", "POST, GET, PUT, UPDATE, OPTIONS") 
      .header("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With") 
      .entity(response).build(); 
+0

L'en-tête doit être ajouté à la réponse à une demande OPTIONS (qui est ce qu'un navigateur envoie comme cette demande « prévol »), pas (seulement) GET ou POST. Peut-être que c'est le problème? –

+0

A quoi ressemble la réponse du serveur lorsqu'elle reçoit une requête OPTIONS, elle est envoyée avant la requête suivante – Ferrybig

+0

La duplication possible de l'en-tête ["No" Access-Control-Allow-Origin "est présente sur la ressource demandée"] (https://stackoverflow.com/questions/20035101/no-access-control-allow-origin-header-is-present-on-the-requested-resource) – Ferrybig

Répondre

0

Je n'ai aucune expérience avec ce que la bibliothèque Java que vous utilisez, mais quelque chose comme ceci doit travailler:

@Override 
public Response options() throws ServiceException 
{ 
    ResponseDto res = new ResponseDto(); 

    return Response.ok().header("Access-Control-Allow-Origin","*").entity(res).build(); 
} 

Si la bibliothèque fonctionne comme je le pense, cela enverra un 200 OK sur chaque demande OPTIONS que vous envoyez à votre serveur, avec l'en-tête Access-Control-Allow-Origin = *. C'est ce que vous devriez viser.

+0

Cela ne fonctionne que si l'API n'implique aucun en-tête personnalisé (comme origine, type de contenu, accept, autorisation), pour les appels API avec certains en-têtes personnalisés cela ne marchera pas –