Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.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 角度刷新终止用户会话_Javascript_Angularjs_Session Cookies - Fatal编程技术网

Javascript 角度刷新终止用户会话

Javascript 角度刷新终止用户会话,javascript,angularjs,session-cookies,Javascript,Angularjs,Session Cookies,我的angular应用程序有问题-用户登录后,如果点击刷新按钮,登录信息将丢失,应用程序将重定向到登录页面。我找到了一个类似的答案,但我不认为它能为我工作,因为我不使用饼干。有人能提出解决办法吗?这是我的授权服务- var app = angular.module('myApp.services'); app.factory('SignIn', ['$resource', '$q', function($resource, $q) { var signInUrl = 'https://

我的angular应用程序有问题-用户登录后,如果点击刷新按钮,登录信息将丢失,应用程序将重定向到登录页面。我找到了一个类似的答案,但我不认为它能为我工作,因为我不使用饼干。有人能提出解决办法吗?这是我的授权服务-

var app = angular.module('myApp.services');

app.factory('SignIn', ['$resource', '$q', function($resource, $q) {
    var signInUrl = 'https://example.com'
    var API = $resource(signInUrl, {}, {
        signIn: {
            withCredentials: true,
            url: signInUrl + '/session',
            method: 'POST'
        },
        signOut: {
            url: authApiUrl + '/session',
            method: 'DELETE'
        },
        currentUser: {
            url: signInUrl + '/users/@me',
            method: 'GET'
        }
    });


    var _currentUser = undefined;

    return {
        isAuthenticated: function() {
            return !!_currentUser;
        },
        getUser: function(){
            var d = $q.defer();

            // If _currentUser is undefined then we should get current user
            if (_currentUser === undefined) {
                API.currentUser(function(userData) {
                    _currentUser = userData;
                    d.resolve(userData);
                }, function(response) {
                    if (response.statusCode === 401) {
                        _currentUser = null;
                        d.resolve(_currentUser);
                    } else {
                        d.reject(response);
                    }
                });
            } else {
                d.resolve(_currentUser);
            }

            return d.promise;
        },
        signIn: function(username, password){
            var d = $q.defer();

            API.signIn({email: username, password: password}, function(data, headers){
                _currentUser = data;
                d.resolve(_currentUser);
            }, d.reject);

            return d.promise;
        },
        signOut: function(){
            var d = $q.defer();

            API.signOut(function(){
                _currentUser = null;
                d.resolve();
            }, d.reject);

            return d.promise;
        }
    };
}]);

如果只需要在刷新后跟踪_currentUser数据,则可以在浏览器中使用sessionStorage。这可以追溯到IE8,在这之前我们真的不应该支持任何浏览器

但通常这些事情都是用饼干做的。当客户机第一次连接到服务器时(在某些情况下甚至在第一次API调用之前),会向客户机发送一个cookie,以便服务器可以维护与该特定客户机关联的会话。这是因为cookie会随每个请求自动发送回服务器,服务器可以检查其本地会话并说,“哦,我在和这个用户说话。现在我可以使用额外的上下文来知道我是否可以满足他们的API调用。”


您在这里没有显示任何其他API调用,但我猜您正在通过每个API调用从_currentUser发送一些东西来识别用户?如果是这样的话,这当然是可行的,而且如果您正在群集服务器,那么就不需要跨多个服务器同步cookie,但是您必须使用一些本地的东西,比如sessionStorage或localStorage,它们不会像您刷新页面时当前内存中的数据副本那样被转储。

谢谢您的回答,John,会话存储是我将在我的服务中实现的吗?是的。在调用服务器获取数据之前,我会检查sessionStorage以查看_currentUser数据是否已经存在。如果不存在,则进行调用并将其存储到sessionStorage和局部变量中。跳入HTML5覆盖了LoalStand和SeStStestCyLoWy()的使用,但是您可能会考虑使用包装库来避免处理JSON的序列化/反序列化,默认情况下,存储API不会让您存储任何东西,而是一个Struth.HMM。我刚刚意识到会话实际上并没有因为刷新而终止,因为它仍然成功地完成了数据的api调用。这实际上可能是某种路由问题。