Angularjs 角度JS-防止控制器运行
因此,我正在做一个简单的“用户是否已登录”检查,如果用户未登录,则将其重定向到sign.html页面。我的代码如下所示:Angularjs 角度JS-防止控制器运行,angularjs,angularjs-routing,angularjs-controller,Angularjs,Angularjs Routing,Angularjs Controller,因此,我正在做一个简单的“用户是否已登录”检查,如果用户未登录,则将其重定向到sign.html页面。我的代码如下所示: var myAppModule = angular.module('myApp', ['ngRoute', 'ngCookies']); myAppModule.config(function($routeProvider) { $routeProvider .when('/page2', { controller:'pagetwo', templateUr
var myAppModule = angular.module('myApp', ['ngRoute', 'ngCookies']);
myAppModule.config(function($routeProvider) {
$routeProvider
.when('/page2', {
controller:'pagetwo',
templateUrl:'pagetwo.html'
})
.when('/signin', {
controller:'signinCTRL',
templateUrl:'signin.html'
})
});
myAppModule.run(function($rootScope, userInfo, $location) {
$rootScope.$on('$routeChangeSuccess', function () {
myCurrentRoute = $location.$$path;
if(myCurrentRoute != "/signin") {
userInfo.checkLogin(); // Check login first. This has the $location.path( "/signin" ); in it.
}
})
});
我的问题是,当用户转到/page2时,$routeChangeSuccess函数会很好地启动,在userInfo.checkLogin()中,我将它们重定向到一个新的路由,该路由会在signin.html页面上重定向它们
问题是,在用户被重定向到signinCTRL控制器之前,pagetwo控制器仍会触发
$rootScope.handleHttpFailure = function(data,status) {
if (401 == status) {
document.location.reload(true);
} else {
console.log("post ERROR status:" + status + " response:" + data);
$rootScope.alert('Error received status:'+ status + " response:" + data );
}
}
是否有办法阻止pagetwo控制器以某种方式运行?我知道我可能只需将所有内容包装在signinCTRL中,以检查用户是否登录,但这与routeChangeSuccess函数的目的背道而驰。我已经处理过这个问题,登录功能是由我的angular js应用程序之外的servlet处理的 我通过javax.servlet.Filter控制对应用程序的访问 我还有另一个过滤器,用于来自应用程序的所有Json请求 对于未经验证的用户场景,Json过滤器的行为如下:
httpResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED); //401
我添加了一个$rootScope方法,强制从JSON控制器登录任何401响应
$rootScope.handleHttpFailure = function(data,status) {
if (401 == status) {
document.location.reload(true);
} else {
console.log("post ERROR status:" + status + " response:" + data);
$rootScope.alert('Error received status:'+ status + " response:" + data );
}
}
因此,对于您的场景,您不能阻止pagetwo控制器运行,但如果您遵循这一相当简单的模式,您可以阻止它访问安全资源。听
$routeChangeStart
而不是$routeChangeSuccess
事件可能会在短期内解决您的问题。您还可以在其中一个路由resolve
map promissions中执行登录检查,并仅返回登录失败的承诺解除。然后,收听$routeChangeError可以导航到登录
url,或者直接从resolve promise导航到它
对于一个更完整的rubust路由解决方案,您可能应该使用任何严肃的angular应用程序都应该使用的路由器(据传将来会进入angular core)
是的,您还应该在服务器端验证正确的登录和授权,并在无效时返回401响应(然后你可以使用Wonder来处理错误。但是我不同意你应该只在服务器端做这件事,这很容易让用户体验糟糕,你当然应该在客户端做基本的测试,而不是看
$routeChangeSuccess
,你可以看这个事件
$locationChangeStart
在调用控制器之前被激发
有关$locationChangeStart
和$routeChangeStart
之间差异的更多信息,请访问
使用
$locationChangeStart
这里是处理错误的最佳方法,并且可以很好地工作
function ($routeProvider, $locationProvider, $httpProvider) {
var interceptor = [
'$rootScope', '$q', function (scope, $q) {
function success(response) {
return response;
}
function error(response) {
var status = response.status;
if (status == 401) {
var deferred = $q.defer();
var req = {
config: response.config,
deferred: deferred
};
window.location = "/";
}
if (status == 404) {
var deferred = $q.defer();
var req = {
config: response.config,
deferred: deferred
};
window.location = "#/404";
}
// otherwise
//return $q.reject(response);
window.location = "#/500";
}
return function (promise) {
return promise.then(success, error);
};
}
];
$httpProvider.responseInterceptors.push(interceptor);
});
// routes
app.config(function($routeProvider, $locationProvider) {
$routeProvider
.when('/404', {
templateUrl: '/app/html/inserts/error404.html',
controller: 'RouteCtrl'
})
.when('/500', {
templateUrl: '/app/html/inserts/error404.html',
controller: 'RouteCtrl'
})
......
};
好奇您为什么要这样做。如果用户导航到一个他们无权查看的页面,您应该让服务器返回403错误。然后您可以捕获该错误并重定向到登录页面。@BenFelda-真的,所有真正的用户身份验证都是通过PHP在服务器端进行的。JS不可能调用pages/fil没有经过授权的php会话,我只关心抛出不需要发生的错误。这个特殊的项目也是我使用Angular的一次学习经历。这正是我想要的。谢谢。