AngularJS - 重定向到登录页面和会话ID的持久性

Ber*_*and 16 angularjs

我正在寻找一种方法来做这两件事,首先我想在没有找到SessionID的情况下将用户重定向到登录页面,其次我想听听你对仅在内存中保存会话ID的看法(没有cookie).

我想出的重定向解决方案是:

1 - 创建一个名为OAuth的服务,它将检查SessionID是否存在,如果不存在,则重定向到登录页面,该服务还负责登录和注销方法.

app.factory('OAuth', ['$http', function ($http) {

    var _SessionID = '';

    return { 
        login: function () {
            //Do login ans store sessionID in var _SessionID
        },

        logout: function () {
            //Do logout
        },

        isLoggedIn: function () {
            if(_SessionID) {
                return true;
            }
            //redirect to login page if false
        }
    };

}]);
Run Code Online (Sandbox Code Playgroud)

2 - 在每个控制器中注入新的OAuth服务,并检查用户是否为LoggedIn

app.controller('myCtrl', ['$scope', 'OAuth', function ($scope, OAuth) {

    //check if user is logged
    OAuth.isLoggedIn();

}]);
Run Code Online (Sandbox Code Playgroud)

问题:

1 - 将在所有控制器中调用isLoggedIn()方法,因此我想知道是否有办法在不必注入服务的情况下执行此操作并在每个控制器中调用它.

2 - 我没有使用cookie存储sessionID,而是将其保存在OAuth的_SessionID变量中,并且每个请求都将其发送到服务器.这是一种可行/安全的方法吗?你能给我一些想法吗?

谢谢!

小智 9

我使用类似的策略(拦截来自服务器的401响应).你可以在这里查看完整的例子:https://github.com/Khelldar/Angular-Express-Train-Seed

它在后端使用node和mobgodb进行会话存储,并在客户端上使用一个精简的http拦截器,它不会像上面链接的Dan那样重试请求:

 var interceptor = ['$q', '$location', '$rootScope', function ($q, $location, $rootScope) {
        function success(response) {
            return response;
        }

        function error(response) {
            var status = response.status;
            if (status == 401) {
                $location.path('/login');
            }
            return $q.reject(response);
        }

        return function (promise) {
            return promise.then(success, error);
        }
    }];
    $httpProvider.responseInterceptors.push(interceptor);
Run Code Online (Sandbox Code Playgroud)


Dan*_*yon 8

我会从这里开始,Witold已经创建了这个很酷的拦截器,可以解决http响应问题.我用它,它真的很有帮助.