AngularJS ne détecte pas l'en-tête Access-Control-Allow-Origin?

j'exécute une application angulaire sur un serveur virtuel local (http://foo.app: 8000). Il adresse une requête à un autre hébergeur virtuel local (http://bar.app: 8000) à l'aide de $http.post.

$http.post('http://bar.app:8000/mobile/reply', reply, {withCredentials: true});

dans L'onglet Réseau de Chrome Developer Tools, je vois bien sûr la requête OPTIONS, et la réponse inclut l'en-tête:

Access-Control-Allow-Origin: http://foo.app:8000

Toutefois, le POSTE demande est annulée avec l'erreur suivante:

Pas de L'en-tête' Access-Control-Allow-Origin ' est présent sur la ressource demandée. Origine 'http://foo.app: 8000' est donc pas autorisé à accéder.

quelqu'un A vécu cette situation? Access-Control-Allow-Origin en-tête est clairement inclus dans la réponse à la demande d'OPTIONS, donc je ne peux pas pour la vie de me comprendre pourquoi la POSTE est en intérim de l'en-tête manquait.

Access-Control-Allow-Credentials également true.

43
demandé sur Nhan 2014-01-14 02:30:32

9 réponses

c'est un bug dans chrome pour le dev local. Essayez de navigateur et d'autres. Puis il va travailler.

46
répondu user1469734 2014-01-13 22:58:24

il y a une solution pour ceux qui veulent utiliser Chrome. cette extension vous permet de demander n'importe quel site avec AJAX de n'importe quelle source, puisqu'il ajoute 'Access-Control-Allow-Origin: *' en-tête de la réponse.

comme alternative, vous pouvez ajouter cet argument à votre lanceur Chrome:--disable-web-security. Notez que je ne l'utiliserais qu'à des fins de développement, pas pour une "navigation sur le web"normale. Pour référence, voir Exécuter en Chrome avec des Drapeaux.

Comme note finale, par l'installation de l' extension mentionnée sur le premier paragraphe, vous pouvez facilement activer/désactiver CORS.

26
répondu Rui Afonso Pereira 2015-05-19 22:22:10

j'envoyais des requêtes d'angularjs en utilisant le service $ http à bouteille en cours d'exécution sur http://localhost:8090/ et j'ai du mettre CORS sinon, j'ai demande des erreurs du type "Non" Access-Control-Allow-Origin' en-tête est présent sur la ressource demandée"

from bottle import hook, route, run, request, abort, response

#https://github.com/defnull/bottle/blob/master/docs/recipes.rst#using-the-hooks-plugin

@hook('after_request')
def enable_cors():
    response.headers['Access-Control-Allow-Origin'] = '*'
    response.headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS, PUT'
    response.headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept'
7
répondu Gabriel 2014-03-06 02:17:26

j'ai vécu exactement le même problème. Pour moi, la requête D'OPTIONS passerait, mais la requête POST dirait "avorté."Cela m'a amené à croire que le navigateur ne faisait jamais la demande de poste du tout. Chrome a dit quelque chose comme" Attention provisional headers are shown " dans les en-têtes de requête, mais aucun en-têtes de réponse n'a été montré. À la fin, je me suis tourné vers le débogage sur Firefox qui m'a amené à découvrir que mon serveur répondait par une erreur et qu'aucun en-tête CORS n'était présent sur le réponse. Chrome recevait effectivement la réponse, mais ne permettait pas que la réponse soit affichée dans la vue réseau.

3
répondu brain_bacon 2014-02-13 22:00:34

les CROS doivent être résolus du côté du serveur.

créer des filtres selon les exigences pour permettre l'accès et ajouter des filtres dans le web.xml

exemple d'utilisation du ressort:

Classe De Filtre:

@Component
public class SimpleFilter implements Filter {

@Override
public void init(FilterConfig arg0) throws ServletException {}

@Override
public void doFilter(ServletRequest req, ServletResponse resp,
                     FilterChain chain) throws IOException, ServletException {

    HttpServletResponse response=(HttpServletResponse) resp;

    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "x-requested-with");

    chain.doFilter(req, resp);
}

@Override
public void destroy() {}

}

Web.xml:

<filter>
    <filter-name>simpleCORSFilter</filter-name>
    <filter-class>
        com.abc.web.controller.general.SimpleFilter
    </filter-class>
</filter>
<filter-mapping>
    <filter-name>simpleCORSFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
3
répondu nkharche 2016-01-12 13:03:17

j'ai rencontré ce problème aujourd'hui. Il s'est avéré qu'un bug sur le serveur (exception du pointeur null) lui a fait échouer la création d'une réponse, mais il a quand même généré un code de statut HTTP de 200. En raison du code d'état 200, Chrome s'attendait à une réponse valide. La première chose que Chrome a faite a été de chercher l'en-tête 'Access-Control-Allow-Origin', qu'il n'a pas trouvé. Chrome a ensuite annulé la demande, et Angular m'a donné une erreur. Le bug pendant le traitement de la requête POST est la raison pour laquelle les OPTIONS de réussir, mais le POSTE serait un échec.

en bref, si vous voyez cette erreur, il se peut que votre serveur n'ait retourné aucun en-tête en réponse à la requête POST.

2
répondu David Hansen 2014-01-31 23:43:21

cela peut aussi se produire lorsque vos paramètres sont erronés dans la requête. Dans mon cas, je travaillais avec une API qui m'a envoyé le message

"Non" Access-Control-Allow-Origin' en-tête est présent sur la ressource demandée. L'origine "null" n'est donc pas autorisée. La réponse contenait le code de statut HTTP 401."

lorsque j'envoie un nom d'utilisateur ou un mot de passe erroné avec la demande de POST pour me connecter.

2
répondu tacticurv 2015-09-26 03:40:04

au Lieu d'utiliser $ http.obtenez de l'('abc/xyz/getSomething') essayez d'utiliser $ http.jsonp('abc / xyz/getSomething')

     return{
            getList:function(){
                return $http.jsonp('http://localhost:8080/getNames');
            }
        }
2
répondu Indranil Acharya 2016-03-30 23:27:49

si vous avez ce problème de voiles.js vient de régler tes cors.js à inclure l'Autorisation, le permis d'en-tête

/***************************************************************************
  *                                                                          *
  * Which headers should be allowed for CORS requests? This is only used in  *
  * response to preflight requests.                                          *
  *                                                                          *
  ***************************************************************************/

  headers: 'Authorization' // this line here
0
répondu Umar Rasydan 2015-11-17 05:32:42