You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

检测登录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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:49:54