如何在Node / Express中链接重定向

时间:2016-01-12 21:05:09

标签: node.js express promise

我正在尝试实现的行为是,当节点应用程序重定向到URL时,一旦完成,我希望节点应用程序随后重定向到另一个URL。

res.redirect('/hello').then(res.redirect('/'))

类似的东西。

我想要实现的是当用户从我的应用程序注销时,他们首先被重定向到我们的身份服务器,这会清除与用户和Identity Server的任何关联,完全将其注销,然后重定向到特定于应用程序的登录(在节点应用程序中配置的路径)。因此,

res.redirect('www.identityserver.com/logout').then(res.direct('www.application.com/auth'))

限制是我无法使用构建身份服务器的post-logout重定向URL实现此功能......仅仅因为我们不想升级到最新版本。此外 - 在应用程序中手动清除其cookie /会话,然后将其重定向到www.application.com/auth,并不能完全取消对它们的身份验证。身份服务器仍然知道并将它们与某个会话/ cookie相关联。

注意:这个问题没有很好的答案,但我尽最大努力选择了答案。

2 个答案:

答案 0 :(得分:0)

正如上面的评论所暗示的那样,你可能不想这样做,但我会回答你的问题,因为它可能会帮助你理解原因。

您可以设置一系列重定向:

app.get('/start', function(req, res) {
    console.log('start');
    res.redirect('/hello');
});

app.get('/hello', function(req, res) {
    console.log('hello');
    res.redirect('/');
});

app.get('/', function(req, res) {
    console.log('/');
    res.end();
});

但请注意,此处的重定向根本不是很有用。 /路由最终在链的末尾所做的任何操作都可以由/start路由预先处理,不需要重定向。

答案 1 :(得分:0)

以下是关于如何做到这一点的想法。

将重定向更改为您自己的特殊重定向页面。在该重定向页面中,您添加了一个指向http://www.identityserver.com/logout页面的iframe。只要注销页面不包含反框架逻辑,就应该实现注销。

现在,由于注销iframe来自与您的网页不同的域而您无法控制它,因此如果没有iframe内的合作,您就无法与iframe的内容进行通信。因此,假设没有来自iframe的合作,您将无法知道注销何时完成。但是,你可能并不需要知道这一点。您需要做的是确保iframe有足够的时间发送它的初始请求,以便身份服务器主机可以接收该注销请求。您可以测试可能的长度,但如果您在此特殊页面加载完成后开始测量时间,那么几秒钟可能足以确保已发送iframe注销请求。

然后,在几秒钟之后,您可以将特殊页面重定向到您想要去的任何新页面。如果您要测量从加载页面开始的时间,那么您可能希望通过设置从该页面中的客户端Javascript进行重定向:

window.location = "http://www.application.com/auth";

现在,您甚至不必加载特殊页面来完成所有这些操作或直接涉及服务器。您可以使用客户端Javascript创建注销iframe,并将其插入到您已经在的任何页面中。它可以以任何方式完成。

至于你最初的想法,来自同一服务器响应的两个重定向的概念在概念上是有缺陷的(主要在评论中解释,但我将在这里总结)。

服务器端重定向包含响应中的自定义标头,指定要转到的新位置以及告知请求者应执行重定向的特定响应状态。根据定义,此结构只能包含一个重定向。并且,一旦重定向发生,浏览器就会转到新服务器上的新页面,而该服务器对该浏览器的影响不再是零。因此,一旦您重定向到注销服务器,您就不能再对事物产生影响了。这完全取决于该注销服务器及其提供接下来发生的页面。