【问题标题】:AngularJS : Understanding service when using $http.postAngularJS:使用 $http.post 时了解服务
【发布时间】:2015-09-29 20:00:56
【问题描述】:

我正在将我的控制器中的所有 http 调用转移到服务中,使用 $q 承诺......一切似乎都在工作,直到我刷新页面然后内容消失。

设置:在我的登录服务中,我有一个执行$http.post 的函数,它需要usernamepassword。然后将响应数据放入promise中。

问题:虽然服务工作正常,但它正在尝试在页面刷新时重新发送 http 调用。然后调用失败,因为没有登录详细信息。

问题:我如何保留/存储原始数据,以便在页面刷新时(并且用户仍然登录)以及在其他情况下使用该服务时控制器它不做http调用它只是返回数据?

服务:

var app = angular.module('myApp', ['ngRoute']);
app.factory('loginService', function($http, $q) {
    var deferResults = $q.defer();
     return {
    appContent: function(login_username, login_password) {
        $http.post('/login',{username: login_username, password: login_password}).success(function(data) {
          deferResults.resolve(myData);
      });
      return deferResults.promise;
    }
});

控制器:

    function loginPageCtrl($scope, loginService) {
       $scope.login = function (login_username, login_password, login_rememberMe) {
          loginService.appContent(login_username, login_username).then(function (data) {
             $scope.pageOneContent = data;
          });
       };
    };

    function pageTwoCtrl($scope, loginService) {
      // Use the same data when page is refreshed
      // without having to pass-in login details

      loginService.appContent().then(function (data) {
         $scope.pageTwoContent = data;
      });
   };

【问题讨论】:

    标签: javascript angularjs angular-services


    【解决方案1】:

    当然会发生这种情况,当页面刷新时,您的应用会丢失其所有状态。您需要将该用户名和密码保存在某个地方,例如 cookie,然后检索它,然后进行第二次 $http 调用,最好将令牌保存在 cookie 中并将其用于身份验证。使用 Angular 的 $cookieStore 来持久化登录详情:

    var userData={username:login_username,password:login_password};
    $cookieStore.put('user_data', userData);
    

    然后当控制器加载时,检查cookie是否存在:

    var userData = $cookieStore.get('user_data');
    return userData
    

    查看this answer 中的源代码以了解实际情况。

    回顾一下,每次控制器加载时检查 cookie,如果未定义则将用户重定向到登录页面,如果未定义则提取令牌/用户名/密码并进行 $http 调用。

    【讨论】:

    • 不使用cookie就无法存档吗?我试图避免将原始密码放入 cookie
    • 检查我提供的链接,在那个答案中有很好的身份验证实现。是的,您永远不应该在客户端存储密码,而是将服务器返回的令牌存储在 cookie 中。
    猜你喜欢
    • 2016-02-19
    • 1970-01-01
    • 2023-03-31
    • 2015-05-15
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    相关资源
    最近更新 更多