【问题标题】:Redirect to new page from post request (server side)从发布请求重定向到新页面(服务器端)
【发布时间】:2019-08-22 23:23:43
【问题描述】:

我有一个 express graphql 端点,可以通过${host}/api/graphql 的 POST 访问。

在该路由上,我有身份验证中间件,如果用户未登录,我想重定向到登录页面。

看起来有点像。

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。

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

提前致谢。

【问题讨论】:

    标签: express http redirect


    【解决方案1】:

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

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

    如果你使用 Apollo Client for graphQl,你可以按照这个指南https://www.apollographql.com/docs/react/features/error-handling/#network-errors

    【讨论】:

      【解决方案2】:

      重定向After-Post代码一般为303(见其他),这应该避免重复使用307的POST方法。

      奇怪的是,303 与 302 几乎相同,接收到此类重定向的浏览器应该跟随它并更改浏览器位置。所以你当前的代码应该已经可以工作了。

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

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

      【讨论】:

        猜你喜欢
        • 2017-04-12
        • 2016-02-27
        • 2018-12-18
        • 2010-09-27
        • 1970-01-01
        • 1970-01-01
        • 2019-06-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多