检测登录Token切换路由时触发无限循环的修复方案咨询
解决路由无限循环的问题
兄弟,你遇到的这个无限循环坑我太熟了!本质就是你的路由跳转逻辑没有排除当前所在的页面——比如用户已经在/login页面了,你的代码还在触发跳转到/login;或者有token时跳去/profile,但跳转后又重复执行了同样的判断逻辑,直接陷入死循环。
快速修复现有代码
先给你改改当前controller里的逻辑,核心就是加个「当前路径判断」,避免重复跳转:
// 获取当前页面路径 var currentPath = $location.path(); // 先验证token有效性(确保token和用户ID都存在) var hasValidToken = !!vm.adsomaToken && !!vm.adsomaUserId; if (hasValidToken) { // 只有当前不在个人资料页时,才跳转 if (currentPath !== '/profile') { $location.path('/profile'); } } else { // 只有当前不在登录页和根路径时,才跳转到登录页 if (currentPath !== '/login' && currentPath !== '/') { $location.path('/login'); } }
为什么这样能解决?举个例子:
- 当用户访问
/且没有token时,代码会跳转到/login;跳转完成后当前路径变成/login,再次执行判断时,因为当前路径是/login,就不会再触发跳转了,循环也就终止了。 - 如果用户已经有token且在
/login页面,代码会检查到当前不是/profile,就跳转到个人资料页,之后也不会重复触发。
更规范的全局路由守卫方案
其实把路由控制逻辑放在单个controller里不是最佳实践,推荐用AngularJS的全局路由拦截(run块)来统一处理,这样所有页面的路由判断都集中在一处,更易维护:
angular.module('你的应用模块名').run(['$rootScope', '$location', function($rootScope, $location) { // 监听路由变化开始的事件 $rootScope.$on('$routeChangeStart', function(event, nextRoute) { var hasValidToken = !!localStorage.adsomaToken && !!localStorage.adsomaUserId; // 定义不需要token就能访问的白名单路径 var allowedPublicPaths = ['/login', '/']; // 情况1:没有token,且要访问的路径不在白名单里 → 强制跳登录 if (!hasValidToken && allowedPublicPaths.indexOf(nextRoute.originalPath) === -1) { event.preventDefault(); // 阻止原路由跳转 $location.path('/login'); } // 情况2:有token,且要访问的是登录页/根路径 → 强制跳个人资料页 else if (hasValidToken && allowedPublicPaths.indexOf(nextRoute.originalPath) !== -1) { event.preventDefault(); $location.path('/profile'); } }); }]);
这个方案的优势是:所有路由跳转都会先经过这个拦截逻辑,不会出现某个页面漏加判断的情况,而且从根源上避免了重复跳转——因为我们是在路由跳转开始前就拦截并修正目标路径,不会触发多次跳转循环。
内容的提问来源于stack exchange,提问作者methuselah
相关产品推荐
相关产品推荐

