角度刷新会终止用户会话

时间:2014-02-17 11:48:19

标签: javascript angularjs session-cookies

我的角度应用程序有问题 - 用户登录后,如果他点击刷新按钮,登录信息丢失,应用程序重定向到登录页面。我找到了类似here using $cookieStore类似的答案,但我不认为它对我有用,因为我没有使用cookies。谁有人建议解决方案?这是我的授权服务 -

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;
        }
    };
}]);

1 个答案:

答案 0 :(得分:1)

如果您只需要在刷新后跟踪_currentUser数据,那么您可以在浏览器中使用sessionStorage。这一直延伸到IE 8,无论如何我们真的不应该支持任何浏览器。

通常这些事情都是用cookies完成的。当客户端首先建立与服务器的连接时(甚至在某些情况下,在第一次API调用之前),cookie将被发送到客户端,以便服务器可以维护与该特定客户端关联的会话。这是因为cookie会随着每个请求自动发送回服务器,服务器可以检查其本地会话并说:“哦,我正在和这个用户交谈。现在我可以使用那个额外的部分上下文知道我是否可以满足他们的API调用。“

您不会在此处显示任何其他API调用,但我猜您是在通过每次API调用向_currentUser发送内容以识别用户?如果是这样,那肯定有效,并且如果您正在集群服务器,它可以避免在多个服务器之间同步cookie的需要,但是您将不得不使用像sessionStorage或localStorage这样的本地内容,这些内容不会像您当前的那样被转储。 - 刷新页面时,数据的内存副本会执行。