51

私は、AJAX呼び出しをrestfull Webサービスに送信する必要があるAngularJSプロジェクトに取り組んできました。この Web サービスは別のドメインにあるため、サーバーで cors を有効にする必要がありました。これらのヘッダーを設定してこれを行いました:

cresp.getHttpHeaders().putSingle("Access-Control-Allow-Origin", "http://localhost:8000");
cresp.getHttpHeaders().putSingle("Access-Control-Allow-Credentials", "true");
cresp.getHttpHeaders().putSingle("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
cresp.getHttpHeaders().putSingle("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With");

AngularJS からバックエンドに AJAX リクエストを送信できますが、セッションの属性を取得しようとすると問題が発生します。これは、sessionid Cookie がバックエンドに送信されないためだと思います。

withCredentials を true に設定することで、jQuery でこれを修正できました。

$("#login").click(function() {
    $.ajax({
        url: "http://localhost:8080/api/login",
        data : '{"identifier" : "admin", "password" : "admin"}',
        contentType : 'application/json',
        type : 'POST',
        xhrFields: {
            withCredentials: true
        },
        success: function(data) {
            console.log(data);
        },
        error: function(data) {
            console.log(data);
        }
    })
});

$("#check").click(function() {
    $.ajax({
        url: "http://localhost:8080/api/ping",
        method: "GET",
        xhrFields: {
            withCredentials: true
        },
        success: function(data) {
            console.log(data);
        }
    })
});

私が直面している問題は、$http サービスを使用して AngularJS でこれを機能させることができないことです。私はこのように試しました:

$http.post("http://localhost:8080/api/login", $scope.credentials, {withCredentials : true}).
            success(function(data) {
                $location.path('/');
                console.log(data);
            }).
            error(function(data, error) {
                console.log(error);
            });

誰が私が間違っているのか教えてもらえますか?

4

3 に答える 3

74

次のように構成オブジェクトを渡す必要があります

$http.post(url, {withCredentials: true, ...})

または古いバージョン:

$http({withCredentials: true, ...}).post(...)

他の質問も参照してください。

于 2013-01-02T19:24:12.093 に答える