使用$cookies和$stateChangeStart检查sessionID是否超过了最大调用堆栈

Using $cookies and $stateChangeStart to check for sessionID exeeding maximum callstack

本文关键字:过了 调用 堆栈 sessionID cookies stateChangeStart 检查 使用 是否      更新时间:2023-09-26

我真的不确定为什么会发生这种情况。我正在尝试监听Angular应用程序中的每一个状态更改,如果用户不是Auth,则将其推回到登录状态。我将他们加密的sessionID存储在一个cookie中,检查该cookie是否未定义,并以此重定向用户。。或者至少这就是我要做的。我将在接下来的过程中使用toState和toParams参数来处理用户角色等,所以你现在可以忽略它们作为任务的一部分。

任何反馈都会有所帮助。提前感谢!

.run(($rootScope, $state, $cookies) => {
      $rootScope.$on('$stateChangeStart', (evt, toState, toParams) => {
            if(!$cookies.get('SessionID')){
                evt.preventDefault();
                $state.go('login');
            }
        })
  })

由于在每次状态更改时都要执行此操作,因此创建了一个无限循环。你可能会对此进行一些修饰,但这应该会让你达到目的:

.run(($rootScope, $state, $cookies) => {
      $rootScope.$on('$stateChangeStart', (evt, toState, toParams) => {
            if(!$cookies.get('SessionID'))
               {
                if (toState.name !== "login") {
                evt.preventDefault();
                $state.go('login');
               }
            }
        })
  })

以上内容将让您开始,但随着您的前进,您会发现还有其他状态需要允许访问,而无需Cookie或身份验证。处理此问题的最佳方法可能是使用您在每个状态上定义的自定义属性。因此,当你定义你的州时,你会做一些类似的事情:

.state('home', {url: '/home', templateUrl: 'views/home.html', authRequired: false}) 
.state('someSecureUrl', {url: '/someSecure.url', templateUrl: 'views/someSecureUrl.html', authRequired: true}) 

然后将上面的代码修改为类似于:

.run(($rootScope, $state, $cookies) => {
          $rootScope.$on('$stateChangeStart', (evt, toState, toParams) => {
                if(!$cookies.get('SessionID')  && toState.authRequired)
                   {
                    evt.preventDefault();
                    $state.go('login');
                }
            })
      })

您还可以考虑使用状态解析函数来完成此操作。