我正在开发一个使用angularJS和PHP的网站。用户可以登录,如果凭证是有效的,如果有效,PHP设置会话并返回存储在localStorage中的令牌。AngularJS-从网站注销不工作
我创建了一个服务来检查令牌的真实性。我也有一个注销控制器。但是我的注销功能无法正常工作。我删除本地存储令牌并销毁会话,然后导航到索引页面,但仍然可以查看其他页面更改URL。
这是我登录控制器
(function() {
angular
.module('myApp.login', [])
.controller('LoginController', function($scope, $http, $location) {
var vm = this;
$scope.post = {};
$scope.post.login = [];
$scope.vm = {};
$scope.index = '';
var baseUrl = 'api/';
// function to submit the form after all validation has occurred
vm.login = function(isValid) {
// check to make sure the form is completely valid
if (isValid) {
$http({
method: 'post',
url: baseUrl + 'login',
data: $.param($scope.vm),
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
})
.success(function(data, status, headers, config) {
if (data.success) {
if (localStorage['token']) {
localStorage.removeItem('token');
}
localStorage.setItem("token", JSON.stringify(data.login_token));
$location.path('/home');
} else {
if (localStorage['token']) {
localStorage.removeItem('token');
}
vm.errorMessage = data.msg;
}
}).
error(function(data, status, headers, config) {
if (localStorage['token']) {
localStorage.removeItem('token');
}
vm.errorMessage = data.msg;
});
}
};
});
})();
一旦登录成功,设置令牌。你可以看到,上面再我重定向用户家庭控制器,看起来像这样:
-(function() {
angular
.module('myApp.home', [])
.factory('myHomeService', function($http) {
var baseUrl = 'api/';
return {
getUserSessInfo: function() {
return $http.get(baseUrl + 'get_user_session');
}
};
})
.controller('HomeController', function($scope, $routeParams, myHomeService, AuthService) {
var vm = this;
var token;
if (localStorage['token']) {
token = JSON.parse(localStorage['token']);
} else {
token = "";
}
if (token) {
AuthService.checkToken(token);
//To get user session value
myHomeService.getUserSessInfo().success(function(data) {
vm.id = data.id;
//vm.userName = data.username;
});
$scope.logout = function() {
var data = {
token: token
}
AuthService.logOut(token);
}
});
})();
在家居控制器,我检查令牌和调用哪个做用户认证服务AuthService
。
这里是AuthService。它有两个功能。一个检查令牌和其他要注销。
(function() {
angular
.module('myApp.AuthenticationService', [])
.factory('AuthService', ["$http", "$location", function($http, $location){
var vm = this;
var baseUrl = 'api/';
vm.checkToken = function(token)
{
var data = {token: token};
$http.post(baseUrl + 'validateUserToken', data).success(function(response)
{
if (response.msg === "unauthorized")
{
//console.log("Logged out");
$location.path('/login');
}
else
{
//console.log("Logged In");
return response.msg;
}
}).error(function(error)
{
$location.path('/login');
})
}
vm.logOut = function(token)
{
var data = {token: token};
$http.post(baseUrl + 'destroyUserToken', data).success(function(response)
{
if (response.msg === "Logged out")
{
localStorage.clear();
//console.log("Logged out");
$location.path('/login');
}
}).error(function(error)
{
localStorage.clear();
$location.path('/login');
})
}
return vm;
}]);
})();
而当用户点击一个注销链接,注销控制器被调用。这是它:
(function() {
angular
.module('myApp.logout', [])
.controller('LogoutController', function($scope, $routeParams, AuthService) {
var vm = this;
//If user is not logged in
var token;
if (localStorage['entrp_token']) {
token = JSON.parse(localStorage['entrp_token']);
} else {
token = "something stupid";
}
AuthService.logOut(token);
});
})();
但即使做完所有这些,用户可以通过更改url导航到较旧的页面。我怎样才能防止这个?
做你的服务器有新的数据响应使用? – Arif
是的..没有使用会话参数的函数返回结果,使用会话参数的函数返回错误。@Arif – Annabelle
所以你想重定向用户回登录页面,如果他们没有登录,并试图查看较旧的页面,对不对? – Arif