我在我的 ember-js 应用程序中应用了 ember-simple-auth-0.6.4.js 并且有一种情况,这很常见。这是步骤的顺序。
- 用户在应用程序中进行身份验证(我为此使用自定义身份验证器)。所以会话变得有效。
- 大约 20 分钟不活动后,后端会话变得无效。
- 用户转到一条路线(从 AuthenticatedRouteMixin 派生),并且由于客户端应用程序中的 ember 会话仍然有效->“会话已验证”检查通过。
- 然后调用路由模型钩子,在其中我尝试使用 ajax 请求从后端加载一些数据 - 我得到 401 未经授权的响应,因为后端会话无效。
- 在 401 错误响应客户端的应用程序会话无效后 - 然后调用 application-route-mixin 中定义的 sessionInvalidationSucceeded() 处理程序,其中位置更改:window.location.replace(Configuration.applicationRootUrl);
问题是:如果在 applicationRootUrl 中定义的 url - 在经过身份验证的路由下 - 登录页面将显示给用户,但在身份验证用户再次转到 applicationRootUrl 后,而不是最初发生 ajax 错误的页面。
我对此的解决方案:
在 AuthenticatedRouteMixin beforeModel() 钩子中,我存储了最后一个转换:
Configuration.beforeInvalidationTransition = transition;
在 ApplicationRouteMixin 我重新定义 sessionInvalidatedSucceeded 钩子:
sessionInvalidationSucceeded: function() { if (Configuration.beforeInvalidationTransition) { this.get(Configuration.sessionPropertyName) .set('attemptedTransition',Configuration.beforeInvalidationTransition); } this.transitionTo(Configuration.authenticationRoute);
因此,如果发生 401 错误,用户将被重定向到登录页面(Configuration.authenticationRoute),并且发生错误的路由 - 存储到尝试转换,因此在成功登录后,用户将被重定向到他停止工作的地方。
这个问题有意义还是有更优雅的解决方案?