res.redirect到post端点?

时间:2019-12-01 05:38:57

标签: node.js express redirect post

我正在使用Node.js,并且有一个处理用户“登录”的终结点。查询数据库,并根据查询结果允许用户登录。我希望在成功登录后使用“ res.redirect”,类似于此处(改编自Express文档),以便传递有关数据库调用返回的用户:

app.post('/login', function (req, res) {

//do stuff here to check database and log the user in...

//then set a path to redirect to an endpoint such as "/users/:email/username/:name/joindate/:joined"

res.redirect('/users/' + "me@somehost.com" + '/username/' + "Frank" + '/joindate/' + "11-30-2019")

//sample output would be... req.params: { "email": "me@somehost.com", "username": "Frank", "joindate": "11-30-2019" }
}

我的问题是通过使用这种方法,将生成GET请求...这是不希望的,因为传递的客户信息可能包含敏感信息(例如电子邮件),因此我不希望使用GET,将敏感信息“清除”。而是可以在请求URL中使用POST ...并按如下方式处理它:

app.post('/users/:email/username/:name/joindate/:joined', function (req, res) {
console.log(req.params);
res.render('accounts', {email: req.params[0], username: req.params[1], joined: req.params[2]});
})

可能吗?我在意识到这一点时遇到问题...如何重定向到POST端点?任何帮助,不胜感激。据我了解,使用POST可以安全地传递敏感信息。谢谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

好吧,您不能使用res.redirect()来指示浏览器将数据回传到服务器。那不是浏览器或http功能。

以下是我可以想到的选项:

  1. 直接从原始帖子中呈现结果,并使用显示的URL。
  2. 直接从原始帖子中呈现结果,并使用客户端Javascript更改显示的URL。
  3. 将数据存储在服务器端会话中,并重定向到服务器从会话中获取数据的URL。
  4. 将数据存储在cookie中,并重定向到服务器从cookie中获取数据的URL。
  5. 将数据存储在以唯一ID为键的临时服务器端数据存储中,并重定向到URL中具有唯一iD的URL,以便服务器可以读取该键并将数据从临时存储中取出对应于该键。您将不得不对该临时存储进行老化,以免数据积累。
  6. 通过Javascript提交原始表单,而不是通过浏览器提交的表单,在该表单中,接收Javascript可以获取JSON响应中的响应URL和数据,取出数据并将其重新发布回服务器。

建议/问题

我的偏好可能是#6,因为在这方面它使服务器保持无状态,并且没有可能的并发问题。

如果您从不希望将数据发送到客户端(也许是最安全的),那么我可能会选择#2或#5,因为它使数据完全保留在服务器端并且没有并发问题。

如果相同的客户端在不同的浏览器窗口/选项卡中执行两个类似的事务,则选项#3和#4可能存在并发问题,因为您存储的状态仅属于那些窗口之一,但与浏览器绑定,而与浏览器无关一个窗口,以便他们可以彼此覆盖。