1

基本認証を使用しているAngularJS Webアプリがあります。これはうまく機能しますが、ユーザーが間違った電子メールまたはパスワードを入力したときに、適切なエラー メッセージを表示したいと考えています。したがって、ここで説明したような理由句で 401 を返します

これは正常に機能し、理由句を含む 401 が正しく返されます。ただし、Angular の $http を使用すると、401 ではなくステータス コード 0 で応答が解釈されます。さらに、ユーザーに伝えたいという理由を読み取る機会がありません。例えば。不明な電子メールまたは間違ったパスワード。

私はこれを Chrome と Firefox でテストし、何の答えも見つからずにたくさんの質問を閲覧してきました。次のような応答インターセプターを実装しました。

$httpProvider.responseInterceptors.push(function ($timeout, $q) {
        return function (promise) {
            return promise.then(function (successResponse) {
                if (successResponse.config.method.toUpperCase() != 'GET')
                    showMessage('Success', 'successMessage', 5000);
                return successResponse;

            }, function (errorResponse) {
                console.log("status: " + errorResponse.status, errorResponse.config);
                switch (errorResponse.status) {
                    case 0:
                    case 401:
                        showMessage('Wrong email or password', 'errorMessage', 20000);
                        break;
                    case 403:
                        showMessage('You don\'t have the right to do this', 'errorMessage', 20000);
                        break;
                    case 500:
                        showMessage('Server internal error: ' + errorResponse.data, 'errorMessage', 20000);
                        break;
                    default:
                        showMessage('Error ' + errorResponse.status + ': ' + errorResponse.data, 'errorMessage', 20000);
                }
                return $q.reject(errorResponse);
            });
        };
    });

インターセプターをデバッグするときは機能しますが、ステータス コードは決して 401 ではなく、代わりに 0 になります。Chrome コンソールでは、次のように表示されます。

XMLHttpRequest cannot load http://localhost:64044/api/user/login/. Origin     
http://localhost:63546 is not allowed by Access-Control-Allow-Origin. 

これを機能させるチャンスはありますか?

4

1 に答える 1

0

ここでの問題は、JavaScript をホストしているサーバーとは別のサーバーにリクエストを送信していることです。このエラー メッセージを回避するには、jsonp を使用する必要があります。

于 2013-09-18T03:01:48.293 に答える