删除路由器重定向上的先前查询字符串

时间:2017-03-30 16:52:01

标签: aurelia

我的aurelia应用程序有两个根,即app-login和app root。当用户尝试访问应用程序但未登录时,会将其发送到app-login路由,该路由只配置了1个路由login

如果未经身份验证的用户尝试访问应用程序,就好像他们已登录一样(例如localhost:3000/#/needsAuthenticationRoute),我希望用户进入登录页面,但是,成功登录后,让他们成为重定向到他们最初尝试访问的页面。

我尝试按如下方式解决问题:

config.mapUnknownRoutes((instruction) => {
  let redirectUrl = 'login';
  console.log(instruction);

  if(instruction.fragment !== '/') {
    let redirect = instruction.fragment;
    if(instruction.queryString) {
      redirect = redirect + '?' + instruction.queryString;
    }
    redirectUrl = router.generate('login', {redirect});
  }
  return {redirect: redirectUrl };
});

因此,从app-login路由,如果他们尝试访问needsAuthenticationRoute,他们将被重定向回到具有重定向参数的登录页面(在这种情况下,用户将被发送到localhost:3000/#/login?redirect=%2FneedsAuthenticationRoute )。

但是,当用户尝试使用查询字符串(例如needsAuthenticationRoute?param=value)访问路由时,我希望将用户重定向到localhost:3000/#/login?redirect=%2FneedsAuthenticationRoute%3Fparam%3Dvalue。但是,重定向保持在查询参数周围,我留下了一个看起来像的路径 localhost:3000/#/login?redirect=%2FneedsAuthenticationRoute%3Fparam%3Dvalue?param=value

有没有人知道在指定重定向指令时如何清除查询参数?或者对我提出的建议有另一种解决方案?

1 个答案:

答案 0 :(得分:0)

我最近刚刚实现了您描述的确切功能(我也有关于此主题的草稿中的博客文章 - 当我开始发布它时...)

我有一堆路由,一些有查询字符串,有些没有。如果用户没有登录我想将它们重定向到登录页面,那么在成功登录后我想将它们重定向到以前的位置。

另外,我想将“?returnUrl =”查询字符串保留在网址之外,它可以工作,但对我来说感觉有点乱 - 考虑到这是所有客户端路由,我知道我可以将它存储在某个地方并“隐藏”它/

首先,我们需要在登录前隐藏他们要去的路线,这是在定义的AuthorizeStep Aurelia AuthorizeStep

中完成的
@inject(MyApi)
class AuthorizeStep implements PipelineStep {
    constructor(private api: MyApi) { }

    public run(navigationInstruction: NavigationInstruction, next: Next): Promise<any> {
        if (navigationInstruction.getAllInstructions().some(i => i.config.settings.roles.indexOf("Client") !== -1)) {
            if (!this.api.LoggedIn && navigationInstruction.config.name !== "login") {
                this.api.RouteFragment = navigationInstruction.fragment;
                return next.cancel(new Redirect("login"));
            }
        }
        return next();
    }
}

最后,登录页面需要知道登录后,用户可能会去某个地方。因此,在成功登录后,我们会检查RouteFragment中是否有任何内容被隐藏起来

if (loginResult.Success) {
    if (this.api.RouteFragment && this.api.RouteFragment.length > 0) {
        // Navigate to where the user was trying to go before Logging In
        this.router.navigate(this.api.RouteFragment);
    } else {
        this.router.navigate("/dashboard");
    }
}