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拦截器处理这个问题的。