使用$cookies和$stateChangeStart检查sessionID是否超过了最大调用堆栈
Using $cookies and $stateChangeStart to check for sessionID exeeding maximum callstack
我真的不确定为什么会发生这种情况。我正在尝试监听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');
}
})
})
您还可以考虑使用状态解析函数来完成此操作。
相关文章:
- Javascript在实现时似乎跳过了一行(如果count==1)
- 我需要迭代一个JSON数组——不知道如何做到——已经搜索过了,但仍然可以'我一点也不知道
- Hammer.js过了一段时间就停止工作了
- grunt contrib jshint-error在定义之前就已经使用过了
- 进行自动实时聊天/虚假聊天,我的javascript跳过了第一个响应
- 正在跳过Ajax调用
- 如果我丢失了调用对象,如何杀死 setInterval()/setTimout()
- 再次调用时跳过了 Ajax
- Mootools 类扩展了调用重写的父方法
- 我试过了,但调用成员单击不适用于输入按钮,它与其他按钮非常不同
- 窗口位置不起作用,我已经尝试过了
- 引导程序下拉不起作用.什么都试过了..(引导2.3.2)
- 为什么将一个值推入我的数组被跳过了
- 七吃九:为什么我的索引8在这个d3选择中被跳过了
- 为什么这个复选框不触发jquery代码onchange?我什么都试过了,但都不起作用
- 尽管通过id进行了调用,但Javascript无法访问jsf outputText(label)元素
- jQuery不工作-'jQuery在定义之前就已经使用过了;
- getElementById有时为null.已经试过了.加载完毕.准备好了
- Javascript跳过函数调用中的参数
- AJAX调用跳过了发送一些参数,或者PHP丢失了一些参数