AngularJS和ExpressJS会话管理? [英] AngularJS and ExpressJS session managment?

查看:132
本文介绍了AngularJS和ExpressJS会话管理?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想保持所有页面的会话。对于这个项目,我使用的是expresJs,nodeJS作为服务器端。 AngularJS在前端。



我不确定,当视图更改或网址更改时,如何处理会话。因为我需要照顾 expresJS路由器或angularJs路由器



请让我知道,我应该怎么做。



angularJS路由器

  myApp。 config(['$ routeProvider',function($ routeProvider){

$ routeProvider.when('/ welcome',{templateUrl:'partials / welcome.html',controller:'MyCtrl2'}) ;
$ routeProvider.when('/ login',{templateUrl:'partials / login.html',controller:'MyCtrl2'});
$ routeProvider.when('/ signup',{templateUrl :'partials / signup.html',controller:'singupController'});
$ routeProvider.otherwise({redirectTo:'/'});
}]);

注册控制器

  myApp.controller('singupController',function($ scope,$ rootScope,$ http){

$ scope.doSingnup = function(){

var formData = {
'username':this.username,
'password':this.password,
'email':null
};

var jdata = JSON.stringify(formData);


$ http({method:'POST',url:'/ signup',data:jdata })
.success(function(data,status,headers,config){

console.log(data);

})
错误(function(data,status,headers,config){

console.log(data)

});

}



})

ExpressJS路由器

  module.exports = exports = function(app,db){

var sessionHandler =新的SessionHandler(db);
var contentHandler = new ContentHandler(db);

//中间件查看用户是否登录
app.use(sessionHandler.isLoggedInMiddleware);


app.get('/',contentHandler.displayMainPage);



app.post('/ login',sessionHandler.handleLoginRequest);


app.get('/ logout',sessionHandler.displayLogoutPage);


app.get(/ welcome,sessionHandler.displayWelcomePage);


app.post('/ signup',sessionHandler.handleSignup);

app.get('*',contentHandler.displayMainPage);

//处理中间件错误
app.use(ErrorHandler);
}

注册后,我想重定向到登录页面。如何在上述路由器上执行此操作。我应该使用以下哪一个来更改app
的视图1)$ location of angularJS
2)ExpresJS的重定向



感谢所有

解决方案

所以我有同样的问题,为了公平起见,我可能已经读过了我不记得的地方了。 / p>

问题:Angular构建单页应用程序。刷新后,您的范围变宽,并通过认证的用户。



方法



AngularJS模块提供了一个名为 run 的启动函数,它被称为always页面加载时。完美的刷新/重新加载。

  myApp.run(function($ rootScope,$ location,myFactory){
$ http.get('/ confirm-login')
.success(function(user){
if(user&& user.userId){
$ rootScope.user = user;
}
});
}

express -session 为您保存会话,并使用您的浏览器发送的sessionId对您进行身份验证,所以它总是知道您是否经过身份验证。

  router.get('/ confirm-login',function(req,res){
res.send(req.user)
}
); $ b $所有我需要做的是,在刷新和所有依赖关系加载后,询问我是否通过身份验证并设置$ rootScope .user = authenticatedUserFromExpress;


I would like to keep session across all the page. For this project, I am using expresJs, nodeJS as server side. AngularJS in front end.

I am not sure, how to handle session when view changes or url changes. Because I need to take care of both expresJS router or angularJs router.

Please let me know, what approach should I follow.

angularJS router

     myApp.config(['$routeProvider', function($routeProvider) {

    $routeProvider.when('/welcome', {templateUrl: 'partials/welcome.html', controller: 'MyCtrl2'});
    $routeProvider.when('/login', {templateUrl: 'partials/login.html', controller: 'MyCtrl2'});
    $routeProvider.when('/signup', {templateUrl: 'partials/signup.html', controller: 'singupController'});
    $routeProvider.otherwise({redirectTo: '/'});
  }]);

Signup controller

     myApp.controller('singupController',function($scope,$rootScope,$http){

    $scope.doSingnup = function() {

       var formData = {
          'username' : this.username,
          'password' : this.password,
           'email' : null
      };

      var jdata = JSON.stringify(formData);


      $http({method:'POST',url:'/signup',data:jdata})
      .success(function(data,status,headers,config){

                console.log(data);

      }).
      error(function(data,status,headers,config){

        console.log(data)

      });

    }



  })

ExpressJS router

    module.exports = exports = function(app, db) {

    var sessionHandler = new SessionHandler(db);
    var contentHandler = new ContentHandler(db);

    // Middleware to see if a user is logged in
    app.use(sessionHandler.isLoggedInMiddleware);


    app.get('/', contentHandler.displayMainPage);



    app.post('/login', sessionHandler.handleLoginRequest);


    app.get('/logout', sessionHandler.displayLogoutPage);


    app.get("/welcome", sessionHandler.displayWelcomePage);


    app.post('/signup', sessionHandler.handleSignup);

    app.get('*', contentHandler.displayMainPage);

    // Error handling middleware
    app.use(ErrorHandler);
}

After signup, I would like to redirect to the login page. How can I do that in the above router. which one of the following should I use to change the view of app 1) $location of angularJS 2) redirect of ExpresJS

Thanks All

解决方案

So i had the same problem and to be fair i might have read the approach somewhere i don't remember anymore.

Problem: Angular builds single page apps. After refresh, you loose scope and with it the authenticated user.

Approach

AngularJS modules offer a startup function called run which is called always when the page is loaded. Perfect for refresh/reload.

myApp.run(function ($rootScope, $location, myFactory) {
    $http.get('/confirm-login')
        .success(function (user) {
            if (user && user.userId) {
                $rootScope.user = user;
            }
        });
}

express-session saves the sessions for you and authenticates you with the sessionId your browser sends. So it always knows if you are authenticated or not.

router.get('/confirm-login', function (req, res) {
        res.send(req.user)
    }
);

All i had to do is, after refreshing and all dependencies were loaded, ask if i am authenticated and set $rootScope.user = authenticatedUserFromExpress;

这篇关于AngularJS和ExpressJS会话管理?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆