Javascript 承诺失败时无限循环中的UI路由器解析
我试图根据身份验证重定向用户,因此在每个路由状态的解析范围内,我放置了用于检查身份验证的服务,因此在本例中是登录和仪表板Javascript 承诺失败时无限循环中的UI路由器解析,javascript,angularjs,angular-ui-router,Javascript,Angularjs,Angular Ui Router,我试图根据身份验证重定向用户,因此在每个路由状态的解析范围内,我放置了用于检查身份验证的服务,因此在本例中是登录和仪表板 .state('login', { url: "/login", abstract: true, templateUrl: '/app/login/login.html' }) // Default login state .state('login.index', {
.state('login', {
url: "/login",
abstract: true,
templateUrl: '/app/login/login.html'
})
// Default login state
.state('login.index', {
url: "",
templateUrl: "/app/login/views/login.html",
controller: 'LoginController',
controllerAs: 'loginCtrl',
resolve: {
UserAuth: session
}
})
.state('dashboard', {
url: "/dashboard",
abstract: true,
templateUrl: '/app/dashboard/dashboard.html',
resolve: {
UserAuth: session
}
})
// Default dashboard state
.state('dashboard.index', {
url: "",
templateUrl: '/app/dashboard/views/page1.html',
controller: 'Page1Controller',
controllerAs: 'page1Ctrl',
resolve: {
UserAuth: session
}
})
// with multiple states like the child route above...
在my.config for routing中,我还设置了上面使用的会话,在承诺成功或存在会话$state.go时设置为dashboard,在承诺失败$state.go时设置为login
.config(function($stateProvider, $urlRouterProvider) {
var session = ['$q', '$location', '$state', 'SessionService',
function( $q, $location, $state, SessionService ) {
return SessionService.session()
.then(function( session ) {
// Check location path as $state is not resolved yet
var location = $location.path();
/**
* Check user authentication to dashboard and handle
* state change if session already exists
*/
if( location.indexOf('login') === 1 ) {
// Redirect to default dashboard view
$state.go('dashboard.index');
}
}, function( error ) {
// Check location path as $state is not resolved yet
var location = $location.path();
/**
* Check for unauthorized access to dashboard and handle
* state change if not located on login view
*/
if( location.indexOf( 'dashboard' ) === 1 ) {
// Redirect to default login view
$state.go('login.index');
}
// Don't propagate error since it has been handled and it prevents page
// return $q.reject( error );
});
}];
但是,当我让会话超时时,它正在运行一个包含403个错误的无限循环,这是承诺失败的正确服务器响应。它进入if语句,并运行$state.go('login.index'),但保持循环,从不用login替换状态。有人能看出我做错了什么吗?在除会话超时之外的所有情况下都能工作,然后不会重定向。我收集了一些我在过去的项目中使用的代码,这些代码显示了我如何设置401/403的身份验证和拦截 请注意,尤其是在前端无法可靠地完成用户授权,并且始终让您的后端进行身份验证,而不是盲目地向您的前端应该使用的某个端点提供数据;-)但我想这是不言而喻的 希望我能帮助你! 再见,
Jan我可以想象出哪里出了问题,login.index路由解决您的SessionService返回的任何问题,它返回成功,因为您的后端登录路由可能未通过身份验证,它重定向到dashboard.index,身份验证失败,重定向到login.index,清洗并重复。只是一个猜测,但这可能是正在发生的事情..耶,我已将$state.go to$location.path('/login')更改为$location.replace();它似乎纠正了这一点。我原以为不返回$q.reject将表明错误已得到处理,并允许路由得到解决,但注意到它不会在返回之前使用$state.go到达那里。谢谢你当我的传声筒。很高兴我能帮上忙!如果您感兴趣,许多人会将HTTP拦截器用于类似的事情。可能还有一些示例代码挂在某处;-)谢谢,如果你有时间的话,我肯定有兴趣看看你是如何使用HTTP拦截器处理这个问题的。