在身份验证和页面刷新时以AngularJS获取用户数据
我制作了一个AuthService,它可以帮助我处理所有的身份验证事务,比如登录、注册、从服务器获取用户数据等等 我正在寻找一个解决方案,它只在登录、页面刷新和触发刷新时运行,从服务获取用户数据,并使其在我包含服务的控制器上可用。我想要类似于vm.user=AuthService.getUserData()的东西,它从服务返回会话变量。大概是这样的:在身份验证和页面刷新时以AngularJS获取用户数据,angularjs,authentication,Angularjs,Authentication,我制作了一个AuthService,它可以帮助我处理所有的身份验证事务,比如登录、注册、从服务器获取用户数据等等 我正在寻找一个解决方案,它只在登录、页面刷新和触发刷新时运行,从服务获取用户数据,并使其在我包含服务的控制器上可用。我想要类似于vm.user=AuthService.getUserData()的东西,它从服务返回会话变量。大概是这样的: function getUserData(){ if (session) { return session.user;
function getUserData(){
if (session) {
return session.user;
}
return null;
}
在$rootScope上。$On(“$stateChangeStart”)我有:
AuthService.loadSessionData();
也就是说:
function loadSessionData() {
$http({
url: API.URL+'auth/session-data',
method: 'GET'
})
.success(function(response)
{
session = response;
})
.error(function(err){
console.log(err);
});
};
这里的一个问题是,我必须在AuthService.getUserData()上设置超时,因为当执行此操作时,从服务器检索会话数据的调用尚未完成,但这是一种不好的做法
这是完整的维修代码使用resolve如何?如果我理解正确,您希望在控制器中保留此数据 您可以将其添加到状态定义中: .state('bla', { template: '...' controller: 'BlaCtrl', resolve: { user: ['AuthService', function(AuthService) { return AuthService.loadSessionData(); } } } .州('bla'{ 模板:“…” 控制器:“BlaCtrl”, 决心:{ 用户:['AuthService',函数(AuthService){ 返回AuthService.loadSessionData(); } } } 另外,更改loadSessionData函数:(确保将$q注入AuthService) 函数loadSessionData(){ 返回$q(函数(解析、拒绝){ $http({ url:API.url+'auth/session data', 方法:“获取” }) .成功(功能(响应) { 如果(答复){ 决心(回应); }否则{ 拒绝(); } }) .error(函数(err){ 拒绝(错误); }); }) } 最后,将resolve函数中的用户对象添加到控制器: app.contoller('BlaCtrl', ['$scope', 'user', function($scope, user) { $scope.user = user; }]); app.contoller('BlaCtrl',['$scope','user',function($scope,user){ $scope.user=用户; }]); 这能实现什么
您应该在getUserData()中调用loadSessionData() 及
我的方法也差不多,因为vm.user=AuthService.getUserData()不等待调用终止,它是异步的,并且vm.user的最终值是未定义的,这是实现该技巧的原因。我要补充的是,我已使用resolve创建了一个抽象状态:{Session:…}因此,我将在从应用派生的每个状态上提供会话。另一个好的调整是,在loadSessionData上,我在开始时检查会话变量是否存在,以便它不再获取数据。我实际上想说的是,您可以更改我编写的内容以使用缓存:)使用根状态时,如果在子状态之间切换,则只解析子状态,而不是父状态。请记住这一点,这样您就不会有一个根状态只解析会话一次,并假定会话从此点起有效。但是,这取决于您不想在应用程序中使用会话的方式此会话不可用实际上,会话是此会话上的用户数据。这保持不变,直到用户更改其配置文件中的某些内容,然后我强制更新它。会话由JWT令牌保留,因此它是分开的。 app.contoller('BlaCtrl', ['$scope', 'user', function($scope, user) { $scope.user = user; }]);
function getUserData(){
loadSessionData()
.success(function(response)
{
if (response) {
return response.user;
}
})
return null;
}
function loadSessionData() {
return $http.get(API.URL+'auth/session-data');
};