私のWebサイトが100%jQueryだったとき、私はこれを行っていました。
$.ajaxSetup({
global: true,
error: function(xhr, status, err) {
if (xhr.status == 401) {
window.location = "./index.html";
}
}
});
401エラーのグローバルハンドラーを設定します。ここで、$resource
および$http
とともにanglejsを使用して、サーバーへの(REST)リクエストを実行します。角度でグローバルエラーハンドラを同様に設定する方法はありますか?
また、angularを使用してWebサイトを構築していますが、グローバル401の処理でこの同じ障害に遭遇しました。このブログ投稿に出会ったとき、私は最終的にhttpインターセプターを使用することになりました。たぶん、あなたは私と同じように役立つと思うでしょう。
「AngularJS(または同様の)ベースのアプリケーションでの認証。」 、espeo software
編集:最終的な解決策
angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives'], function ($routeProvider, $locationProvider, $httpProvider) {
var interceptor = ['$rootScope', '$q', function (scope, $q) {
function success(response) {
return response;
}
function error(response) {
var status = response.status;
if (status == 401) {
window.location = "./index.html";
return;
}
// otherwise
return $q.reject(response);
}
return function (promise) {
return promise.then(success, error);
}
}];
$httpProvider.responseInterceptors.Push(interceptor);
ResponseInterceptorsはAngular 1.1.4で廃止されていることに注意してください。以下に official docs に基づく抜粋があり、インターセプターを実装する新しい方法を示しています。
$provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
return {
'response': function(response) {
// do something on success
return response || $q.when(response);
},
'responseError': function(rejection) {
// do something on error
if (canRecover(rejection)) {
return responseOrNewPromise;
}
return $q.reject(rejection);
}
};
});
$httpProvider.interceptors.Push('myHttpInterceptor');
これは、Coffeescriptを使用して私のプロジェクトでどのように見えるかです:
angular.module("globalErrors", ['appStateModule']).factory "myHttpInterceptor", ($q, $log, growl) ->
response: (response) ->
$log.debug "success with status #{response.status}"
response || $q.when response
responseError: (rejection) ->
$log.debug "error with status #{rejection.status} and data: #{rejection.data['message']}"
switch rejection.status
when 403
growl.addErrorMessage "You don't have the right to do this"
when 0
growl.addErrorMessage "No connection, internet is down?"
else
growl.addErrorMessage "#{rejection.data['message']}"
# do something on error
$q.reject rejection
.config ($provide, $httpProvider) ->
$httpProvider.interceptors.Push('myHttpInterceptor')
次の内容でファイル<script type="text/javascript" src="../js/config/httpInterceptor.js" ></script>
を作成します。
(function(){
var httpInterceptor = function ($provide, $httpProvider) {
$provide.factory('httpInterceptor', function ($q) {
return {
response: function (response) {
return response || $q.when(response);
},
responseError: function (rejection) {
if(rejection.status === 401) {
// you are not autorized
}
return $q.reject(rejection);
}
};
});
$httpProvider.interceptors.Push('httpInterceptor');
};
angular.module("myModule").config(httpInterceptor);
}());