【发布时间】:2016-01-21 07:06:31
【问题描述】:
我试图实现的行为是,当节点应用程序重定向到一个 URL 时,一旦完成,我希望节点应用程序随后重定向到另一个 URL。
res.redirect('/hello').then(res.redirect('/'))
类似的东西。
我想要实现的是,当用户从我的应用程序中注销时,他们首先会被重定向到我们的身份服务器,这会清除与用户和身份服务器的任何关联,将他们完全注销,然后重定向到特定于应用程序的登录名(在节点应用程序中配置的路径)。因此,
res.redirect('www.identityserver.com/logout').then(res.direct('www.application.com/auth'))
限制是我无法使用构建身份服务器的注销后重定向 URL 来实现这一点......仅仅是因为我们不想升级到最新版本。此外 - 在应用程序中手动清除其 cookie/会话,然后将它们重定向到 www.application.com/auth 并不能完全取消对它们的身份验证。身份服务器仍然知道它们并将它们与某些会话/cookie 相关联。
注意:这个问题没有好的答案,但我尽最大努力选择了答案。
【问题讨论】:
-
你为什么要这样做?
-
为什么还要尝试重定向两次?一个给定的 http 响应只能有一个重定向位置。您显然误解了重定向的工作原理。这是返回给浏览器的单个 http 响应,它告诉浏览器下一步该去哪里。然后,浏览器将发出一个新请求来加载该新位置,并且该新请求与当前响应无关。
-
您尝试做的事情表明您不了解服务器端重定向的工作原理。请查看我在之前的评论中添加的内容。您必须重定向到 /logout 然后在那个请求处理程序中,您可以再次重定向。而且,要仅为该用户执行此操作,您必须在会话类型中设置一些内容,以便您可以识别该用户何时再次回来。
-
@jfriend00 你的意思是来自身份服务器的请求处理程序吗?我知道您来自哪里,但我无法控制修改身份服务器
-
是的。您正在将浏览器发送到该其他服务器。当您重定向到该注销页面时,浏览器要做的下一件事就是从该服务器获取一个页面并加载它。您现有的服务器不再与该浏览器有任何关系。如果您不控制注销页面或注销服务器,则您无法告诉浏览器在该页面之后去哪里。