我的 Angular 应用程序出现问题 - 用户登录后,如果他点击刷新按钮,登录信息将丢失,应用程序将重定向到登录页面。我找到了类似 here using $cookieStore 的 SO 答案但我不认为它对我有用,因为我没有使用 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;
}
};
}]);
最佳答案
如果您只需要在刷新后跟踪 _currentUser 数据,那么您可以在浏览器中使用 sessionStorage。这一直延伸到 IE 8,无论如何我们真的不应该支持在那之前的任何浏览器。
不过,通常这些事情都是通过 cookie 完成的。当客户端第一次连接到服务器时(在某些情况下甚至在第一次 API 调用之前),一个 cookie 被发送到客户端,这样服务器就可以维护与该特定客户端关联的 session 。这是因为 cookie 会随每个请求自动发送回服务器,并且服务器可以检查其本地 session 并说,“哦,我正在与这个用户交谈。现在我可以使用那个额外的部分了解我是否可以满足他们的 API 调用的上下文。”
您没有在此处显示任何其他 API 调用,但我猜您是在每次 API 调用时从 _currentUser 发送一些内容来识别用户?如果是这样,那肯定有效,并且如果您正在集群服务器,它避免了跨多个服务器同步 cookie 的需要,但是您将不得不使用本地的东西,比如 sessionStorage 或 localStorage,它们不会像您当前的那样被转储- 刷新页面时数据的内存副本。
关于javascript - Angular 刷新终止用户 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21828294/