本文介绍了失去的Cookie /会话时重新加载页面的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有两个单独的应用程序:
- AngularJS客户端工作
- API的NodeJS服务器工作
API的NodeJS服务器只是给JSON数据到客户端的(并没有给任何HTML页)。
我存储有关的sessionStorage autentificated用户的信息。
问题:
当我登录到系统和重装页,我失去了有关用户信息的sessionStorage。
下面是我的AngularJS身份验证服务:
module.exports =功能($ HTTP,$位置$饼干,$警报,$窗口){
$ window.sessionStorage.setItem('的currentUser,JSON.stringify($ cookies.get(用户)));
$ cookies.remove(用户); 返回{
登录:功能(用户){
返回$ http.post(的http://本地主机:3000 / API /登录,用户).success(功能(数据){
$ window.sessionStorage.setItem('的currentUser',JSON.stringify(数据));
$ location.path('/ fillprofile'); $警报({
标题:干杯!,
内容:您已成功登录。,
位置:右上,
类型:'成功',
持续时间:3
});
})错误(函数(){
$警报({
标题:错误!,
内容:无效的用户名或密码。,
位置:右上,
类型:危险,
持续时间:3
});
});
},
注册:功能(用户){
返回$ http.post(的http://本地主机:3000 / API /注册,用户).success(功能(数据){
$ location.path('/登录'); $警报({
标题:恭喜你!,
内容:'你的账户已经建立。,
位置:右上,
类型:'成功',
持续时间:3
});
})错误(功能(响应){
$警报({
标题:错误!,
内容:response.data,
位置:右上,
类型:危险,
持续时间:3
});
});
},
注销:功能(){
返回$ http.get(的http://本地主机:3000 / API /注销').success(函数(){
$ window.sessionStorage.setItem('的currentUser,NULL);
$ cookies.remove(用户);
$ location.path('/登录'); $警报({
内容:您已被注销。,
位置:右上,
类型:'信息',
持续时间:3
});
});
}
};
};
API的NodeJS
app.use(功能(REQ,资源,下一个){
如果(req.user){
res.cookie(用户,JSON.stringify(req.user));
}
下一个();
});功能ensureAuthenticated(REQ,资源,下一个){
如果(req.isAuthenticated())下一个();
别的res.send(401);
}passport.serializeUser(功能(用户,完成){
DONE(NULL,user.id);
});passport.deserializeUser(功能(ID,完成){
User.findById(ID,函数(ERR,用户){
DONE(ERR,用户);
});
});passport.use(新LocalStrategy(功能(用户名,密码,完成){
User.findOne({用户名:用户名},功能(ERR,用户){
如果(ERR)回做(ERR);
(!用户),如果做回报(NULL,FALSE);
user.comparePassword(密码功能(呃,isMatch){
如果(ERR)回做(ERR);
如果(isMatch)回做(NULL,用户);
返回完成(NULL,FALSE);
});
});
}));
路线
app.post('/ API /登录,passport.authenticate(本地),功能(REQ,RES){
res.cookie(用户,JSON.stringify(req.user));
res.send(req.user);
});app.post('/ API /注册'功能(REQ,资源,下一个){
VAR用户=新用户({
用户名:req.body.username,
电子邮件:req.body.email,
密码:req.body.password
});
user.save(功能(错误){
如果(ERR)返回下一个(ERR);
res.send(200);
});
});app.get('/ API /注销,功能(REQ,资源,下一个){
req.logout();
res.send(200);
});
解决方案
尝试删除 $ cookies.remove('用户');
第3行
I have two separate applications:
- AngularJS client working on http://localhost:8080
- NodeJS API server working on http://localhost:3000
NodeJS API Server just gives json data to client (and does not give any html pages).
I store information about autentificated user in sessionStorage.
The Problem:When I login into system and reload page, I lost information about user in sessionStorage.
Here is my AngularJS auth service:
module.exports = function($http, $location, $cookies, $alert, $window) {
$window.sessionStorage.setItem('currentUser', JSON.stringify($cookies.get('user')));
$cookies.remove('user');
return {
login: function(user) {
return $http.post('http://localhost:3000/api/login', user).success(function(data) {
$window.sessionStorage.setItem('currentUser', JSON.stringify(data));
$location.path('/fillprofile');
$alert({
title: 'Cheers!',
content: 'You have successfully logged in.',
placement: 'top-right',
type: 'success',
duration: 3
});
}).error(function() {
$alert({
title: 'Error!',
content: 'Invalid username or password.',
placement: 'top-right',
type: 'danger',
duration: 3
});
});
},
signup: function(user) {
return $http.post('http://localhost:3000/api/signup', user).success(function(data) {
$location.path('/login');
$alert({
title: 'Congratulations!',
content: 'Your account has been created.',
placement: 'top-right',
type: 'success',
duration: 3
});
}).error(function(response) {
$alert({
title: 'Error!',
content: response.data,
placement: 'top-right',
type: 'danger',
duration: 3
});
});
},
logout: function() {
return $http.get('http://localhost:3000/api/logout').success(function() {
$window.sessionStorage.setItem('currentUser', null);
$cookies.remove('user');
$location.path('/login');
$alert({
content: 'You have been logged out.',
placement: 'top-right',
type: 'info',
duration: 3
});
});
}
};
};
NodeJS API
app.use(function(req, res, next) {
if (req.user) {
res.cookie('user', JSON.stringify(req.user));
}
next();
});
function ensureAuthenticated(req, res, next) {
if (req.isAuthenticated()) next();
else res.send(401);
}
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
passport.use(new LocalStrategy(function(username, password, done) {
User.findOne({ username: username }, function(err, user) {
if (err) return done(err);
if (!user) return done(null, false);
user.comparePassword(password, function(err, isMatch) {
if (err) return done(err);
if (isMatch) return done(null, user);
return done(null, false);
});
});
}));
Routes
app.post('/api/login', passport.authenticate('local'), function(req, res) {
res.cookie('user', JSON.stringify(req.user));
res.send(req.user);
});
app.post('/api/signup', function(req, res, next) {
var user = new User({
username: req.body.username,
email: req.body.email,
password: req.body.password
});
user.save(function(err) {
if (err) return next(err);
res.send(200);
});
});
app.get('/api/logout', function(req, res, next) {
req.logout();
res.send(200);
});
解决方案
Try removing $cookies.remove('user');
on line 3
这篇关于失去的Cookie /会话时重新加载页面的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!