2013-06-11 27 views
2

所以,我有一個我用Angular編寫的應用程序。它本質上是一個SPA,除了我的登錄是通過傳統的非Ajax請求完成的。我想要的只是在服務器返回401時將頁面(完全繞過路由)重定向到/註銷。我可以設置基於ajax的登錄,但坦率地說我沒有看到好處。鑑於此,如果這樣做更容易 - 我會盡我所能讓我度過這個瘋狂令人討厭的障礙,而jQuery非常簡單。這裏是我的,當我刪除授權cookie時,使我陷入無限循環:AngularJS(1.1.5)未經授權響應的無限循環

var manageModule = angular.module('manageModule', ['ngResource']); 

manageModule.config(function($httpProvider, $routeProvider, $locationProvider) { 

     $httpProvider.defaults.headers.put['Content-Type'] = 
      'application/x-www-form-urlencoded'; 
     $httpProvider.defaults.headers.post['Content-Type'] = 
      'application/x-www-form-urlencoded'; 


     $locationProvider.html5Mode(false); 


     $httpProvider.interceptors.push(function($q, $window) { 
      return { 
       'responseError': function(rejection) { 
        var status = rejection.status; 
        if (status == 401) { 
         console.log('401 inside if'); 
         $window.location.href = contextPath + '/logout'; 
        } 
        return $q.reject(rejection); 
       } 
      } 
     }); 


     $routeProvider 
      .when('/majors', { 
       templateUrl: contextPath+'/manage/majors', 
       controller: ManageMajorsController 
      }) 
      .when('/users', { 
       templateUrl: contextPath+'/manage/users', 
       controller: ManageUsersController 
      }) 
      .when('/courses', { 
       templateUrl: contextPath+'/manage/courses', 
       controller: ManageCoursesController 
      }) 
      .when('/notes', { 
       templateUrl: contextPath+'/manage/notes', 
       controller: ManageNotesController 
      }) 
      .when('/manage', { 
       templateUrl: contextPath+'/manage/majors', 
       controller: ManageMajorsController 
      }); 

}); 

感謝您提供任何幫助!

這似乎是一些新的行爲,我記得它在一個重定向循環。無論哪種方式,這都是無限輸出到控制檯的東西。

Error: 10 $digest() iterations reached. Aborting! 
Watchers fired in the last 5 iterations: [["fn: function(){var a=d.url(),b=f.$$replace;if(!m||a!=f.absUrl())m++,\nc.$evalAsync(function(){c.$broadcast(\"$locationChangeStart\",f.absUrl(),a).defaultPrevented?f.$$parse(a):(d.url(f.absUrl(),b),i(a))});f.$$replace=!1;return m}; newVal: 15; oldVal: 14"],["fn: function(){var a=d.url(),b=f.$$replace;if(!m||a!=f.absUrl())m++,\nc.$evalAsync(function(){c.$broadcast(\"$locationChangeStart\",f.absUrl(),a).defaultPrevented?f.$$parse(a):(d.url(f.absUrl(),b),i(a))});f.$$replace=!1;return m}; newVal: 16; oldVal: 15"],["fn: function(){var a=d.url(),b=f.$$replace;if(!m||a!=f.absUrl())m++,\nc.$evalAsync(function(){c.$broadcast(\"$locationChangeStart\",f.absUrl(),a).defaultPrevented?f.$$parse(a):(d.url(f.absUrl(),b),i(a))});f.$$replace=!1;return m}; newVal: 17; oldVal: 16"],["fn: function(){var a=d.url(),b=f.$$replace;if(!m||a!=f.absUrl())m++,\nc.$evalAsync(function(){c.$broadcast(\"$locationChangeStart\",f.absUrl(),a).defaultPrevented?f.$$parse(a):(d.url(f.absUrl(),b),i(a))});f.$$replace=!1;return m}; newVal: 18; oldVal: 17"],["fn: function(){var a=d.url(),b=f.$$replace;if(!m||a!=f.absUrl())m++,\nc.$evalAsync(function(){c.$broadcast(\"$locationChangeStart\",f.absUrl(),a).defaultPrevented?f.$$parse(a):(d.url(f.absUrl(),b),i(a))});f.$$replace=!1;return m}; newVal: 19; oldVal: 18"]] 
    at Error (<anonymous>) 
    at Object.e.$digest (http://localhost:8080/MetroCredit/static/bundle-main_defer.js:91:135) 
    at Object.e.$apply (http://localhost:8080/MetroCredit/static/bundle-main_defer.js:92:431) 
    at j (http://localhost:8080/MetroCredit/static/bundle-main_defer.js:101:80) 
    at r (http://localhost:8080/MetroCredit/static/bundle-main_defer.js:104:449) 
    at XMLHttpRequest.v.onreadystatechange (http://localhost:8080/MetroCredit/static/bundle-main_defer.js:106:90) bundle-main_defer.js:63 
Uncaught Error: 10 $digest() iterations reached. 
+0

當你說無限循環時,你是指角度摘要循環限制還是它實際上永遠循環到某處。如果它正在循環播放,您是否看到控制檯中有任何內容(例如:'401 inside if')?當您嘗試在瀏覽器中暫停JavaScript執行時會發生什麼?循環在哪裏?它是一個重定向循環嗎? – rtcherry

+0

我會發布循環 –

+0

我註釋掉了我的http攔截器代碼,實際上也發生了同樣的事情。 –

回答

0

它可能與此issue有關。

我已經在我的控制器使用此之前,當我不想在所有使用角的路由:

// Abort Angular JS default location change handling. 
$scope.$on('$locationChangeStart', function(event, newUrl, oldUrl) { 
    if (newUrl == $location.absUrl()) { 
    event.preventDefault(); 
    } 
}); 

對於你的情況,它看起來像你只是想擺脫困境的某些網址,所以你可能需要/需要做一些模式匹配來代替newUrl == $location.absUrl()

因爲我想避免所有Angular的路由機制,所以這可能對您不太合適,我不確定它與新版本的兼容性。我已經使用它與Angular 1.0.x版本。

+0

當我包含該代碼,我的路由根本沒有工作 –

+0

我在1.1.5上,我切換到1.0.7,我不再得到那個無限循環 –

+0

什麼我發佈*應該*殺死所有的路由,這就是爲什麼我說你需要改變它只在某些條件下調用'event.preventDefault()'。 – rtcherry

相關問題