从发布请求(服务器端)重定向到新页面

时间:2019-08-22 23:23:43

标签: express http redirect

我有一个明确的graphql端点,可以通过POST在${host}/api/graphql到达。

在那条路由上,我具有身份验证中间件,并且如果用户未登录,则希望重定向到登录页面。

看起来像这样。

const authCheck = (req, res, next) => {

  const referringUrl = req.get('referer');

  try {
    const token = req.cookies.Auth;

    jwt.verify(token, process.env.AUTH_PRIVATE_KEY);

    next();
  } catch(err) {
    res.redirect(302, `/login?redirect=${referringUrl}`);
  }
}

起初,我将其作为响应状态代码307,并且在GET请求中可以正常工作。浏览器按预期将页面更改为referringUrl

但是对于Post请求,使用状态307导致浏览器重定向使用post方法。很好,所以我切换到302。现在它发送了一个get请求,但实际上并没有更改浏览器中的URL。

如何从服务器端完成此功能?

谢谢。

2 个答案:

答案 0 :(得分:1)

重定向的Post-Post代码通常为303(请参见其他),这应该避免重用您在307中使用的POST方法。

奇怪的是303与302几乎是同一件事,并且接受这种重定向的浏览器应该跟随它并更改浏览器位置。因此,您当前的代码应该已经可以使用。

您说过Now it sends a get request but doesn't actually change the url in the browser,所以我想您可能正在谈论Ajax通话?如果通过XhmlHttpRequest进行POST,那么您的问题不仅在于服务器端。这是关于处理Ajax调用中的重定向。然后,您可以遵循几个路径。您可以在堆栈溢出时搜索“重定向”和“ ajax”并找到一些建议。例如,您可以构建自己的应用程序级别协议,而不在JSON响应中发送HTTP重定向,而是发送应用程序重定向,并让js客户端理解它并更改位置,或进行其他操作。这是一个讨论很多的话题。

在安全性/鲁棒性方面,您可能需要做一些调整,例如在redirect()调用中使用的位置使用encodeURI并检查referer是否来自您真正处理过的域(或仅在登录页面的redirect参数上强制执行亲戚网址)。

答案 1 :(得分:1)

就像@regilero所说的,客户端方面的问题。您的GraphQl服务器无法在浏览器中更改url,因为js代码而不是浏览器发出请求。

您可以捕获30 *错误状态,并在客户端代码上手动进行重定向。

如果您将Apollo Client用于graphQl,则可以遵循本指南https://www.apollographql.com/docs/react/features/error-handling/#network-errors