Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检查angularjs单页应用中页面重新加载的登录状态_Javascript_Html_Angularjs_Single Page Application_Angularjs Service - Fatal编程技术网

Javascript 检查angularjs单页应用中页面重新加载的登录状态

Javascript 检查angularjs单页应用中页面重新加载的登录状态,javascript,html,angularjs,single-page-application,angularjs-service,Javascript,Html,Angularjs,Single Page Application,Angularjs Service,我有一个单页angularjs应用程序,在该应用程序中,每当路线发生变化时,我都会在按照此解决方案将登录表单提交到服务器后,通过存储在服务中的变量检查用户的登录状态: //服务 .factory('Auth', function(){ var user; return{ setUser : function(aUser){ user = aUser; }, isLoggedIn : function(){ return(user)? u

我有一个单页angularjs应用程序,在该应用程序中,每当路线发生变化时,我都会在按照此解决方案将登录表单提交到服务器后,通过存储在服务中的变量检查用户的登录状态:

//服务

 .factory('Auth', function(){
var user;

return{
    setUser : function(aUser){
        user = aUser;
    },
    isLoggedIn : function(){
        return(user)? user : false;
    }
  }
})
问题是,当我通过刷新按钮重新加载整个页面时,服务中的变量将丢失,用户将被重定向到登录页面,即使用户会话在后端仍处于打开状态


如何仍然管理服务中的变量?我曾想过使用sessionStorage,但听起来不够安全。

我认为您可以从两种方式中选择:

通过会话在服务器端持久化数据 将数据存储在localStorage中,或者更好地存储在window.sessionStorage中,这样页面重新加载不会影响申请人
也许angular Cookie可以解决您的问题

尝试将数据存储在$window.localStorage angular abstraction over javascript window.localStorage中

例如:

(function () {
angular.module('app').factory('UserIdentity', ['$window', function ($window) {

    this.UserName = function () {
        return $window.localStorage.getItem("username");
    };

    this.Token = function () {
        return $window.localStorage.getItem("token");
    };

    this.create = function (token, userName) {
        $window.localStorage.setItem("token", token);
        $window.localStorage.setItem("username", userName);
    };
    this.destroy = function () {
        $window.localStorage.removeItem("token");
        $window.localStorage.removeItem("username");
    };
    this.isAuthenticated = function () {
        var token = $window.localStorage.getItem("token");
        return !!token;
    }
    return this;
}]);

})

您可以在angular应用程序初始化时检查用户的登录状态,并可以在应用程序的根范围内进行设置。因此,它可以在应用程序中的任何位置访问。你可以引导你的用户会话,而不是真正的会话,而是用户详细信息(如果已验证或未定义),然后从后端服务器将其作为javascript注入主视图。在前端,从javascript中读取该变量,即使在刷新后也会有一个持久会话。我想到了localStorage和sessionStorage,但我怀疑sessionStorage的安全性只有应用程序窗口可以访问数据,而localStorage是全局的。对于与安全相关的操作,应始终针对服务器进行检查。
(function () {
angular.module('app').factory('UserIdentity', ['$window', function ($window) {

    this.UserName = function () {
        return $window.localStorage.getItem("username");
    };

    this.Token = function () {
        return $window.localStorage.getItem("token");
    };

    this.create = function (token, userName) {
        $window.localStorage.setItem("token", token);
        $window.localStorage.setItem("username", userName);
    };
    this.destroy = function () {
        $window.localStorage.removeItem("token");
        $window.localStorage.removeItem("username");
    };
    this.isAuthenticated = function () {
        var token = $window.localStorage.getItem("token");
        return !!token;
    }
    return this;
}]);