本文介绍了失去的Cookie /会话时重新加载页面的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个单独的应用程序:


  1. AngularJS客户端工作

  2. 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:

  1. AngularJS client working on http://localhost:8080
  2. 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 /会话时重新加载页面的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-27 17:51