angularjs卫星重定向回到上一页

时间:2015-03-16 18:40:19

标签: angularjs satellizer

我在我的角度代码中使用卫星来处理我对本地api的身份验证。我没有将任何第三方API身份验证与我的网站集成,一切都是本地的。我得到网站工作,如果用户使用无效令牌,系统会将用户重定向到登录页面。如果我需要在用户登录后返回请求的链接,该怎么办?

例如,

。如果用户请求访问'/ customer / detail / 123',但用户被重定向到登录页面(/ account / login),登录成功后,如何将用户重定向回'/ customer / detail / 123'

4 个答案:

答案 0 :(得分:1)

Satellizer无法帮助您解决此问题。我也碰到了这个并创建了一个服务来处理这个问题。因此,如果用户被重定向到/ login,我将路径保存在服务中。登录后,将其从服务中重定向到保存的路径。

  1. 使用ui-router时,通过监听'$ stateChangeStart'来检测每个更改。当状态发生变化并需要登录时,请通过以下方式保存当前路径:'$ location.path()'

  2. 登录后,将路径设置为$ location.path();

  3. 希望这会有所帮助。 Lieuwe

答案 1 :(得分:1)

我在我的项目中做了同样的事情。检查一下。

$rootScope.$on('$stateChangeStart', function(event, next, current) {

    if(next.name != 'user_login' && next.name != 'user_register')
    {
        // I am using localStorage module but you can do the same 
        // using your way of storing values to localstorage
        localStorageService.set('redirect_back_path', next.name);
        localStorageService.set('redirect_back_path_params', current);
    }
});

这里我存储两个值redirect_back_path以存储当前请求的状态名称,并存储每个请求redirect_back_path_params以存储当前请求所具有的参数,“在您的示例中为123”。

我不知道为什么angular会将即将到来的请求的参数保存到current对象。也许其他人可以在这里回答。

好的,现在您需要做的是,在登录后,检查redirect_back_path中是否有任何值,如果是,

$state.go(localStorageService.get('redirect_back_path'), localStorageService.get('redirect_back_path_params');

否则只需转到任何其他默认页面。

希望这有帮助。

答案 2 :(得分:0)

我遇到了与卫星相同的问题

由于ui-router 1.0.0-alpha1,$ stateChangeStart和此类事件不再受支持:https://github.com/angular-ui/ui-router/issues/2655

我使用以下内容并且完美运行:

卫星0.15.5,ui-router 1.0.0-beta.3,角1.6.1

app.run(['$transitions', '$state', '$auth', 'CommonService', function ($transitions, $state, $auth, CommonService) {
    $transitions.onStart({}, function (transition) {
        var state = transition.to();
        if (state.resolve && state.resolve.loginRequired && !$auth.isAuthenticated())
        {
            CommonService.RedirectState = state.name;
            return $state.target('login');
        }
        else if (CommonService.RedirectState && $auth.isAuthenticated())
        {
            var target = $state.target(CommonService.RedirectState);
            CommonService.RedirectState = null;
            return target;
        }
    });
}]).service('CommonService', [ 
    function ()
    {
        this.RedirectState = null;
    }]);

当用户询问受限制(resolve:loginRequired)状态且未经过身份验证时,我们会将状态存储在服务中并将其重定向到“登录”状态。状态。

稍后当用户通过身份验证后,我们发现其中有一个' RedirectState'在服务中(即使卫星重定向到' /'默认情况下),我们只需将用户重定向到' CommonService.RedirectState'并删除服务中的引用。无需本地存储/其他模块。没有对satelizer默认配置进行任何更改。我只是在路由配置后添加了这个。

答案 3 :(得分:0)

基于DavidT,我改为使用原始参数重定向:

app.run(['$transitions', '$state', '$auth', 'CommonService', function ($transitions, $state, $auth, CommonService) {
    $transitions.onStart({}, function (transition) {
        var state = transition.to();
        var para = transition.targetState();
        if (state.resolve && state.resolve.loginRequired && !$auth.isAuthenticated())
        {
            CommonService.RedirectState = state.name;
            CommonService.RedirectParams = para;
            return $state.target('login');
        }
        else if (CommonService.RedirectState && $auth.isAuthenticated())
        {
            var target = $state.target(CommonService.RedirectState, CommonService.RedirectParams._params);
            CommonService.RedirectState = null;
            CommonService.RedirectParams = null;
            return target;
        }
    });
}]).service('CommonService', [ 
    function ()
    {
        this.RedirectState = null;
        this.RedirectParams = null;
    }]);