【问题标题】:Angular refresh kills user session角度刷新会杀死用户会话
【发布时间】:2014-03-16 16:51:47
【问题描述】:

我的 Angular 应用程序出现问题 - 用户登录后,如果他点击刷新按钮,登录信息会丢失并且应用程序会重定向到登录页面。我找到了类似here using $cookieStore 的答案,但我不认为它对我有用,因为我没有使用 cookie。任何人都可以提出解决方案吗?这是我的授权服务-

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

【问题讨论】:

    标签: javascript angularjs session-cookies


    【解决方案1】:

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

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

    您没有在此处显示任何其他 API 调用,但我猜您是在 _currentUser 中发送一些内容,并使用每个 API 调用来识别用户?如果是这样,那肯定行得通,并且如果您正在集群服务器,它避免了跨多个服务器同步 cookie 的需要,但是您将不得不使用不会像您当前在-刷新页面时数据的内存副本。

    【讨论】:

    • 感谢约翰的回答,我会在我的服务中实现 sessionStorage 吗?
    • 是的。在调用服务器获取它之前,我会检查 sessionStorage 以查看 _currentUser 数据是否已经存在。如果它不存在,请进行调用并将其存储到 sessionStorage 和您的本地变量中。 Dive Into HTML5 很好地涵盖了 localStorage 和 sessionStorage 的使用 (diveintohtml5.info/storage.html),但您可能会考虑使用包装库来避免处理 JSON 的序列化/反序列化,默认情况下,存储 API 不会让您存储除字符串之外的任何内容.
    • 嗯。我刚刚意识到会话实际上并没有被刷新杀死,因为它仍然成功地调用了 api 数据。这实际上可能是某种路由问题。
    猜你喜欢
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    相关资源
    最近更新 更多