因此,在身份验证和转换方面似乎存在既定模式。
转换检查身份验证 - >会话已过期 - >存储的尝试过渡 - >重定向到登录 - >成功登录 - >重试尝试过渡
我们已经实现了它并且工作正常。现在我们想知道当一个动作包含例如休息调用时由于会话过期导致认证失败时该怎么办?在这里,我们希望重定向到登录,就像转换一样,但问题是我们如何才能到达应用程序之前的位置?存储routeName是不够的,因为可能存在动态段。在后台是否有任何ember对象存储当前路由,包括url参数?
答案 0 :(得分:1)
好的,为了庆祝我发现我记得先前正在寻找的Transition
source code这一事实,我继续在我正在研究的Ember应用程序中为您测试了这个。简而言之,是的,您可以随时retry()
存储转换,因此我的建议是始终存储最新的转换,然后retry
在您的会话到期情况下必要时。那么,无论如何最新的有用转换,你当然应该忽略你到登录路线等的过渡。
你甚至可以像我刚才那样使用类似的相对快速的安排。在我的应用程序路由routes/application.js
中,我添加了以下操作处理程序
actions: {
willTransition: function(transition) {
this.set('_latestTransition', transition);
},
saveTransition: function() {
var transition = this.get('_latestTransition');
console.log('transition saved', transition);
this.set('_transitionSnapshot', transition);
},
retryTransition: function() {
var transition = this.get('_transitionSnapshot');
console.log('transition retry', transition);
transition.retry();
}
}
然后,对于我的测试,我只是在一个始终可见的菜单中添加了两个按钮:一个用于触发saveTransition
操作,另一个用于retryTransition
操作。结果是,正如我已经破坏的那样,在点击我的保存按钮,之后再进行几次其他过渡,然后单击重试按钮后,我在第一次单击保存按钮时返回页面。动态细分很好;我没有在任何地方使用查询参数,所以测试它们不够快,让我烦恼,但Transition
对象显然也支持这些。
由于这些操作处理程序驻留在应用程序路径中,只要应用程序中没有其他任何内容处理这些名称的操作(或者特别是在willTransition
情况下,操作会通过返回true
来冒泡),他们将在这里得到处理。如上所述,您可以自己使用此方法,或者根据您的需要和评论中的建议,使用某些服务中介存储必要的转换。
答案 1 :(得分:0)
答案 2 :(得分:0)
我假设您使用的是ember-simple-auth。在这种情况下,请尝试在应用程序路由中添加以下代码:
actions: {
error: function (error, transition) {
/**
* Handle 401 error during model hook
*/
if (error.errors !== undefined) {
for (var i = 0; i < error.errors.length; i++) {
if (error.errors[i].status !== undefined) {
if (parseInt(error.errors[i].status) === 401) {
transition.abort();
this.set('session.attemptedTransition', transition);
this.transitionTo('login');
return false;
}
}
}
}
return true;
}
}
我从authenticated-route-mixin获取的这一重要内容this.set('session.attemptedTransition', transition);
。