angular js-controller wird das cookie vom login-request-header, auch nachdem ich eine Erhalten Sie nach der Anmeldung

Derzeit durch die Verwendung der setTimeout-Methode bin ich in der Lage, erfolgreich zu tun, was ich will. Dies ist aber nicht der ideale Ansatz.

Wenn wir senden Sie eine login-Anfrage, man will das CSRF-token aus dem Antwort-header und verwenden Sie es insubsequent http-Aufrufe. Die http.get () - Anforderung bedeutet, dass für uns(es legt die login-Antwort-header in den request-header). Danach wollen wir eine post-Anforderung wieder, basierend auf der Antwort, die wir erhalten, aus der http.get () - Anforderung innerhalb der login callback.

Hier das problem, dass der code immer ausgeführt, bevor der browser beendet, Einstellung der CSRF-token empfangen von response in den request-header. Um dieses problem zu überwinden, ich habe eine setTimeout-Funktion. Aber ich weiß nicht wirklich, wie das Konzept der Zugabe eines hardcoded delay.

Gibt es eine effiziente Möglichkeit, dies zu tun?

        app.controller('loginCtrl', function ($scope, $http, $location, $cookies, $q, Cart,$rootScope)
{
        var defer = $q.defer();

        $scope.submit = function(){

                $http.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded;application/JSON";
                //login
                $http.post('http://127.0.0.1:8000/api/user/login/', JSON.stringify({'email': $scope.email, 'password': $scope.password})
                ).success(function(data){

                defer.promise.then(function(){
                //need to get a cart to check if a cart is created
                    Cart.getCart(function(data){


                    defer.promise.then(function(){
               //if cart not created create one
                        if(data.length == 0){
                            setTimeout(function(){
                                $http.defaults.headers.common["X-CSRFToken"] = $cookies.csrftoken;
                                Cart.addCart(function(data){
                                    alert('cart successfully created \n ' + JSON.stringify(data));
                                    $rootScope.cartId = data[0].pk
                                    $rootScope.cart = data[0].fields;
                                    $location.path('/products');
                                }, function(error){
                                    alert('addcart failed');
                            });
                            },300);

                        } else {
                            $rootScope.cartId = data[0].pk;
                            $rootScope.cart = data[0].fields;
                            $location.path('/products');
                        }

             })

                }, function(error){
                    alert('getcart failed');
                });
            })
                //need code to get the cookies, still dont know how

                }).error(function(data){
                alert('failure');
                });


        defer.resolve();        
        };
});
Ich kann nicht den code binden mit dem, was in Worten beschrieben.
Ich kann versuchen zu erklären, das problem, das ich an diesem Projekt zu arbeiten. Wir senden eine POST-Anforderung an unseren Django-Anwendung anmelden. Nach der Anmeldung senden wir eine ERHALTEN die Benutzer in den Einkaufswagen legen, und wenn es keinen Warenkorb für den Benutzer haben wir eine neue erstellen(Sie können sehen, dass im obigen code überprüfen wir die Daten.Länge == 0). Wenn es keine Wagen wir POSTEN Sie eine Anfrage zu erstellen Warenkorb. In Django müssen wir X-CSRFToken auf POST-Anfrage. Wenn wir nicht rufen addCart fuction Aufruf innerhalb der setTimeout-Funktion,die X-CSRF-Angriffe auf die POST-Anforderung ist nicht das gleiche wie der Satz auf der login-Antwort und gibt 401err
Ah stimmt, der code ist ein wenig verwirrend. Vermutlich defer eingeführt wurde, in einem Versuch, um die Sache zu arbeiten. So weit wie ich kann sagen, es ist nicht notwendig und kann gefahrlos entfernt werden. Was übrig bleibt sieht aus wie es sollte funktionieren, aber es scheint, dass es irgendeine Art von Rennen Wirkung in Einstellung $http.defaults.headers.common["X-CSRFToken"]. Sehr seltsam, da die Angabe einer Standard-header sollte zuverlässig synchron.

InformationsquelleAutor Karan Khanna | 2013-12-25

Schreibe einen Kommentar