Javascript AngularJS-登录并关闭选项卡后,它不会重定向到主页

Javascript AngularJS-登录并关闭选项卡后,它不会重定向到主页,javascript,angularjs,angularjs-authentication,Javascript,Angularjs,Angularjs Authentication,我已经用yeoman、grunt和bower创建了一个angularJS应用程序。我尝试了一个简单的登录示例。登录后,它将转到主页。对于任何路由更改,它将检查用户是否登录。如果登录,它将重定向到主页或特定路由,否则重新路由到登录页面。这一切对我来说都很好 这里是app.js 'use strict'; //Define Routing for app angular.module('mainApp', []).config(['$routeProvider', '$locationProvide

我已经用yeoman、grunt和bower创建了一个angularJS应用程序。我尝试了一个简单的登录示例。登录后,它将转到主页。对于任何路由更改,它将检查用户是否登录。如果登录,它将重定向到主页或特定路由,否则重新路由到登录页面。这一切对我来说都很好

这里是app.js

'use strict';
//Define Routing for app
angular.module('mainApp', []).config(['$routeProvider', '$locationProvider',
  function($routeProvider,$locationProvider) {
    $routeProvider
    .when('/login', {
        templateUrl: 'login.html',
        controller: 'LoginController'
    })
    .when('/register', {
        templateUrl: 'register.html',
        controller: 'RegisterController'
      })
    .when('/home', {
       templateUrl: 'views/home.html',
       controller: 'homeController'
    })
    .otherwise({
       redirectTo: '/home'
    });
}])
.run( function($rootScope, $location) {
    // register listener to watch route changes
    $rootScope.$on( "$routeChangeStart", function() {
        var url=$location.path();
        var location=url.replace("/","");
        var authnotallowed=false;
        if(location.indexOf("login")!=-1||location.indexOf("register")!=-1){
            authnotallowed=true
        }
        if ( $rootScope.loggedUser == null ) {
            // not logged user, should be going to #login
            if(authnotallowed){
                $location.path(url);
            } else{
                $location.path( "/login" );
            }
        } else {
            // not going to #login, should redirect now
            if(authnotallowed){
                $location.path("/home");
            } else{
                $location.path(url);
            }

        }
    });
});

angular.module('mainApp').factory("page", function($rootScope){
    var page={};
    var user={};
    page.setUser=function(user){
        $rootScope.loggedUser=user;
    }
    return page;
});
'use strict';

angular.module('mainApp').controller('LoginController', function($scope, $location, page) {
    $scope.user = {};
    $scope.loginUser=function(){
        var name=$scope.user.name;
        var pwd=$scope.user.password;
        if(name=="1234" && pwd=="1234"){
            page.setUser($scope.user);
            $location.path( "/home" );
        } else {
            alert("Invalid credentials");
        }
    }
});
这是我的loginControler.js

'use strict';
//Define Routing for app
angular.module('mainApp', []).config(['$routeProvider', '$locationProvider',
  function($routeProvider,$locationProvider) {
    $routeProvider
    .when('/login', {
        templateUrl: 'login.html',
        controller: 'LoginController'
    })
    .when('/register', {
        templateUrl: 'register.html',
        controller: 'RegisterController'
      })
    .when('/home', {
       templateUrl: 'views/home.html',
       controller: 'homeController'
    })
    .otherwise({
       redirectTo: '/home'
    });
}])
.run( function($rootScope, $location) {
    // register listener to watch route changes
    $rootScope.$on( "$routeChangeStart", function() {
        var url=$location.path();
        var location=url.replace("/","");
        var authnotallowed=false;
        if(location.indexOf("login")!=-1||location.indexOf("register")!=-1){
            authnotallowed=true
        }
        if ( $rootScope.loggedUser == null ) {
            // not logged user, should be going to #login
            if(authnotallowed){
                $location.path(url);
            } else{
                $location.path( "/login" );
            }
        } else {
            // not going to #login, should redirect now
            if(authnotallowed){
                $location.path("/home");
            } else{
                $location.path(url);
            }

        }
    });
});

angular.module('mainApp').factory("page", function($rootScope){
    var page={};
    var user={};
    page.setUser=function(user){
        $rootScope.loggedUser=user;
    }
    return page;
});
'use strict';

angular.module('mainApp').controller('LoginController', function($scope, $location, page) {
    $scope.user = {};
    $scope.loginUser=function(){
        var name=$scope.user.name;
        var pwd=$scope.user.password;
        if(name=="1234" && pwd=="1234"){
            page.setUser($scope.user);
            $location.path( "/home" );
        } else {
            alert("Invalid credentials");
        }
    }
});
对我来说一切都很好

因为我使用的是grunt,所以url类似于
http://localhost:9000/#/login
登录后,如果我输入like
http://localhost:9000/#/login
http://localhost:9000/#/register
或任何其他url。如果我注销并尝试任何页面,它将转到登录

问题是,当我尝试登录时,
http://localhost:9000/
或者我关闭选项卡并再次打开url,它将进入登录页面(表示loggedUser为空)

为什么会这样?我该怎么解决呢


我需要做些饼干什么的吗?如果是这样,怎么做?

那么,在重新加载页面后,您将重新加载应用程序<代码>$rootScope.loggedUser变为空。是的,您可以使用coockies来存储会话。这是angularjs

别忘了包括
angular cookies.js

首先添加模块依赖项:

angular.module('mainApp', ['ngCookies'])
第二:注入$cookieStore服务

angular.module('mainApp', ['ngCookies']).controller('LoginController', function($scope, $location, page, $cookieStore)
第三:使用cookies:

 $scope.loginUser=function(){
        var isLoggedIn = $cookieStore.get('isLoggedIn');

        var name=$scope.user.name;
        var pwd=$scope.user.password;
        if(name=="1234" && pwd=="1234" || isLoggedIn){
            page.setUser($scope.user);
            $location.path( "/home" );
            $cookieStore.put('isLoggedIn', true);
        } else {
            $cookieStore.remove('isLoggedIn');
            alert("Invalid credentials");
        }
    }

但请注意,这是一种非常基本、简单且不安全的会话维护方法

嗯,在重新加载页面之后,您需要重新加载应用程序<代码>$rootScope.loggedUser变为空。是的,您可以使用coockies来存储会话。这是angularjs

别忘了包括
angular cookies.js

首先添加模块依赖项:

angular.module('mainApp', ['ngCookies'])
第二:注入$cookieStore服务

angular.module('mainApp', ['ngCookies']).controller('LoginController', function($scope, $location, page, $cookieStore)
第三:使用cookies:

 $scope.loginUser=function(){
        var isLoggedIn = $cookieStore.get('isLoggedIn');

        var name=$scope.user.name;
        var pwd=$scope.user.password;
        if(name=="1234" && pwd=="1234" || isLoggedIn){
            page.setUser($scope.user);
            $location.path( "/home" );
            $cookieStore.put('isLoggedIn', true);
        } else {
            $cookieStore.remove('isLoggedIn');
            alert("Invalid credentials");
        }
    }
但请注意,这是一种非常基本、简单且不安全的会话维护方法

根据您的评论


我不知道怎么做

我建议您对angularJS中的会话管理进行一些研究。我可以为你指出一些如何实现这一目标的方向,但你必须问问自己,在你的情况下,哪种方法更有效。这通常是一个体系结构讨论,需要在应用程序的体系结构首次构建时进行讨论

检查这些链接以开始

  • 根据你的评论


    我不知道怎么做

    我建议您对angularJS中的会话管理进行一些研究。我可以为你指出一些如何实现这一目标的方向,但你必须问问自己,在你的情况下,哪种方法更有效。这通常是一个体系结构讨论,需要在应用程序的体系结构首次构建时进行讨论

    检查这些链接以开始


  • 你怎么维持训练?我不知道怎么做你怎么维持训练?我不知道怎么做?你能给我一些样品吗?@ShijuKBabu补充了一个例子谢谢。那么,在我的
    run
    方法中,如何检查?@ShijuKBabu添加$cookieStore来运行回调参数,获取cookie值:
    var isLoggedIn=$cookieStore.get('isLoggedIn')。好的。。。我需要在cookie中存储用户对象吗?因为,如果他们已经登录,我还需要设置用户对象值。如何设置?你能给我一些样品吗?@ShijuKBabu补充了一个例子谢谢。那么,在我的
    run
    方法中,如何检查?@ShijuKBabu添加$cookieStore来运行回调参数,获取cookie值:
    var isLoggedIn=$cookieStore.get('isLoggedIn')。好的。。。我需要在cookie中存储用户对象吗?因为,如果他们已经登录,我还需要设置用户对象值。