IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AngularJS Discussion :

Cors et angular js


Sujet :

AngularJS

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2013
    Messages : 25
    Par défaut Cors et angular js
    Bonsoir,

    J'essaie tant bien que mal de faire interagir mon api rest développé avec Spring/Spring Security et mon application client développé avec angular.

    Lorsqu'ils sont sur le même serveur, ces deux applications fonctionnent parfaitement. Lorsqu'elles sont sur des serveurs différents, j'ai une infinité de problème lié au CORS.

    Chaque fois que je résous un problème, un autre se créé, ce qui fait que mon CORS ne fonctionne pas du tout correctement. Pour certaines requêtes ça marche, pour d'autre ça ne marche pas...

    Le problème, c'est que je dois envoyer un header particulier à chaque requête, header qui contient un token identifiant l'utilisateur. Parfois cet header est envoyé, parfois non!

    Exemple: le header est envoyé à l'appel de la requête /login en post, qui identifie l'utilisateur (cette ressource n'est pas protégée!). Il ne l'ajoute pas quand il s'agit de certaines ressources protégées, comme /quote/create en post, qui attend un objet de type Quote en paramètre. Là, le header n'est pas ajouté!

    Voilà comment j'ai fait pour ajouter ce Token à chaque requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    angular.module("quoteApp").factory("httpResponseInterceptor", [
        "$q", "$location", "$cookieStore", function($q, $location, $cookieStore) {
            return{
                request: function(config) {
                    var token = $cookieStore.get("token");
                    if (token && token.key) {
                       config.headers["X-Auth-Token"] =  token.key;
                    }
                    return  config || $q.when(config);
                },
                'requestError': function(rejection) {
     
                    return $q.reject(rejection);
                },
    // other stuff
    Voici mon filtre CORS:

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     @Override
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
             //This is not even printing
            HttpServletResponse response = (HttpServletResponse) res;
            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", "Accept, X-Auth-Token, Content-Type");
            chain.doFilter(req, res);
        }


    Dans ma configuration Spring, j'ai tout essayé. J'ajoute mon filtre ici, dans mon WebInitializer:

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
       @Override
        protected Filter[] getServletFilters() {
            CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
            characterEncodingFilter.setEncoding(ENCODING_UTF8);
            characterEncodingFilter.setForceEncoding(true);
            return asPrimitiveArray(
                    characterEncodingFilter,
                    new SimpleCORSFilter(),
                    new DelegatingFilterProxy("springSecurityFilterChain"),
                    new OpenEntityManagerInViewFilter());
        }


    Le problème, c'est qu'angular n'envoit pas le header pour certaines requêtes!

    Remote Address:::1:8080
    Request URL:http://localhost:8080/quote/quote/create
    Request Method:OPTIONS
    Status Code:401 Non-Autorisé
    Request Headersview source
    Accept:*/*
    Accept-Encoding:gzip,deflate,sdch
    Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
    Access-Control-Request-Headers:accept, x-auth-token, content-type
    Access-Control-Request-Method:POST
    Cache-Control:no-cache
    Connection:keep-alive
    Host:localhost:8080
    Origin:http://localhost:9000
    Pragma:no-cache
    Referer:http://localhost:9000/
    User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36
    Response Headersview source
    Access-Control-Allow-Headers:Accept, X-Auth-Token, Content-Type
    Access-Control-Allow-Methods:POST, GET, OPTIONS, DELETE
    Access-Control-Allow-Origin:*
    Access-Control-Max-Age:3600
    Cache-Control:no-cache, no-store, max-age=0, must-revalidate
    Date:Sat, 19 Jul 2014 18:01:19 GMT
    Expires:0
    Pragma:no-cache
    Server:Apache-Coyote/1.1
    Transfer-Encoding:chunked
    X-Content-Type-Options:nosniff
    X-Frame-Options:DENY
    X-XSS-Protection:1; mode=block



    Je ne comprends vraiment pas pourquoi. Merci pour votre aide.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2013
    Messages : 25
    Par défaut Résolu
    J'ai résolu mon problème en modifiant mon filtre de cette manière:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
     
            HttpServletResponse response = (HttpServletResponse) res;
            response.setHeader("Access-Control-Allow-Origin", "*");
            response.setHeader("Access-Control-Allow-Methods", "POST, GET,  DELETE, PUT");
            response.setHeader("Access-Control-Max-Age", "3600");
            response.setHeader("Access-Control-Allow-Headers", "Accept, Content-Type, Origin, Authorization, X-Auth-Token");
            response.addHeader("Access-Control-Expose-Headers", "X-Auth-Token");
            if (request.getMethod().equals("OPTIONS")) {
                try {
                    response.getWriter().print("OK");
                    response.getWriter().flush();
                } catch (IOException e) {
                    LOG.error(e.getMessage());
                }
            } else {
                chain.doFilter(request, response);
            }
     
        }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Amazon S3 supporte CORS
    Par Hinault Romaric dans le forum Cloud Computing
    Réponses: 1
    Dernier message: 05/09/2012, 14h05
  2. Réponses: 0
    Dernier message: 12/12/2011, 19h32
  3. CORS + Ajax + Session (avec PHP)
    Par Sergejack dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 28/08/2011, 18h23
  4. javafx : café corsé
    Par r1-1024 dans le forum JavaFX
    Réponses: 8
    Dernier message: 23/09/2009, 18h48
  5. Programme coré et la bibliothèque <setjump.h>
    Par turbo_chess dans le forum C
    Réponses: 2
    Dernier message: 09/05/2007, 12h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo