使用Angular2创建单个页面应用程序,我正在拦截未经身份验证的用户访问自定义 RouterOutlet
中的非公共路由并将其重定向到登录视图 . 成功登录后,我想将用户重定向到最初请求的视图,而不是默认视图 .
我注意到 Router
有一个 renavigate()
函数导航到最后一个成功的路由但是最后一个成功的路由是 /auth/login
而不是最初请求的url .
基本上:我如何访问或确定以前请求的URL?
我真的不想求助于传递查询字符串参数,除非我真的需要 . 理想情况下,作为 Router
组件的一部分访问 history
集合会很好,类似于 backbone.history
!
4 回答
使用Auth Guards(实现CanActivate)来防止未经身份验证的用户 . 请参阅带有示例的official documentation和this blog .
在auth guard中使用RouterStateSnapshot来捕获请求的URL .
login.component.ts
中) . 例如 .this._router.navigateByUrl(redirectUrl);
附: @MichaelOryl和@Vitali的建议可行,但我的方式更符合Angular2最终版本 .
您可以在docs中找到
Location
类所需的内容 .back()
函数可能会为您完成 .另一种方法是订阅
Location
中的popstate
事件 . MDN has docs谈论你可能会收到的 Value 观 .否则,您可能需要一种跟踪路由器中的更改的服务,以便您可以访问它们 .
在这种情况下,我正在访问
Router
对象并订阅任何更改,以便我可以跟踪它们 .这对我有用 . 将它注入主App组件的构造函数中,并在bootstrap方法中注册它 . 页面加载的第一个
val
应该是原始URL . 我之后取消订阅是高效的,因为我(可能还)想要在此服务中监听后续路由器事件 . 将服务注入需要originalUrl的其他位置 .Updated Example Using Angular 2.2.1
将原始URL传递给登录组件的Auth Guard:
登录后重定向到上一个/原始URL的登录组件:
有关更多详细信息和工作演示,您可以查看this post