如果他的会话处于活动状态,我试图在每个页面加载之前检查,如果没有,则重定向到登录页面。 这是我的App.js
var app = angular.module('Test', ['ngRoute']);
app.config(function($routeProvider){
$routeProvider
.otherwise({
resolve:
{
"checkUserSession": function($q,$http,$window)
{
console.log('start of the def')
var deffered = $q.defer();
$http.get('/general/php/getCurrentUser.php')
.then(function(result)
{
if(!result)
{
deffered.reject();
$window.location.href = "/";
}
else
{
deffered.resolve();
}
});
$window.location.href = "/";
return deffered.promise;
}
}
})
});
它不会执行console.log,$ http.get()或任何重定向。 如果承诺得到解决或拒绝并不重要,它看起来像是" checkUserSession"永远不会执行;
每个页面都包含angular-route.js脚本。
答案 0 :(得分:0)
使用拦截器。
在我的情况下,我在本地存储中检查身份验证令牌,但您可以在此处使用会话逻辑。
从angular.module(...).config
-
.config(function ($stateProvider, $urlRouterProvider, $httpProvider) {
$httpProvider.interceptors.push('BearerAuthInterceptor');
...
然后使用以下服务:
.factory('BearerAuthInterceptor', function ($q, $injector, $window) {
return {
request: function (config) {
config.headers = config.headers || {};
var tk = $window.localStorage.getItem('token');
if (tk) {
config.headers.Authorization = 'Bearer ' + tk;
}
return config || $q.when(config);
},
response: function (response) {
return response || $q.when(response);
},
responseError: function (rejection) {
if (rejection.status === 401) {
// Redirect to login ui-route
$injector.get('$state').go('login');
}
return $q.reject(rejection);
}
};
})
这里有一些很好的例子:http://www.webdeveasy.com/interceptors-in-angularjs-and-useful-examples/