首页 > 解决方案 > 如何在发送包含要设置的标头和来自后端(Node.js)的重定向 url 的响应时为客户端(浏览器)设置 HTTP 标头?

问题描述

如果我在这里遗漏了一些非常基本的东西,我真的很抱歉,但是这里......

简介:我的问题与此处的问题相同:如何在 nodejs 中请求页面时设置标题?,而汗先生的回答只是没有解释如何从后端(Node.js)设置标头。我会在那里发表评论,但我没有足够的业力:(

这是我到目前为止所做的:

const newTokens = await jwt.generateJWT(user); // generateJWT is a custom function that returns two tokens
res.setHeader("Authorization", `Bearer ${newTokens.accessToken}`);
res.setHeader("refresh-token", newTokens.refreshToken);

return res.redirect("/member/dashboard");

上面的代码能够将 HTTP 标头发送到浏览器,但不能在浏览器上为域设置它们。

Firefox 中的响应标头是:

HTTP/1.1 302 Found
X-Powered-By: Express
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiNjA3MDgyNDlmNjBjNjE1YWU4NTdjMmU4IiwidXNlcl9yb2xlIjoibWVtYmVyIiwidXNlcl9uYW1lIjoiQWxleCIsImlhdCI6MTYxNzk5OTM5NywiZXhwIjoxNjE3OTk5OTk3fQ.Odb6TrWBnf9dq00T_ddxD9hqVjhFQYdqA5pP2u6y-2k
refresh-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiNjA3MDgyNDlmNjBjNjE1YWU4NTdjMmU4IiwiaWF0IjoxNjE3OTk5Mzk3LCJleHAiOjE2MTc5OTk5OTd9.kY9DZWprHxZFMI3btX-yzZxiUrqZY3kdmxzyc3apAyw
Location: /member/dashboard
Vary: Accept
Content-Type: text/html; charset=utf-8
Content-Length: 78
Date: Fri, 09 Apr 2021 20:16:37 GMT
Connection: keep-alive

注意:“授权”和“刷新令牌”标头已发送,重定向“位置”也已设置,导致 302 状态代码。

不幸的是,由于未设置标头,因此标头似乎并未在来自客户端的所有后续请求中返回。

如果我做的事情明显错误,请告诉我。

编辑:我试图直接从后端执行此操作的原因是我不想依赖前端来处理这项工作,因为我不打算实现特定于框架的前端,即它应该跨所有框架。

PS:如果我的英语不好,请原谅我,这不是我的母语。

标签: javascriptnode.jsjwthttp-headers

解决方案


当您这样做res.redirect()时,浏览器不会将您在该响应中设置的标头应用于重定向请求。这些标头是返回给请求客户端的响应的一部分,仅此而已。它们不会与重定向的请求一起发送。

服务器无法控制重定向请求的标头。浏览器不能那样工作,所以如果你依赖标准浏览器作为客户端,你就不能那样设计东西。

如果您正在使用重定向并且您希望通过重定向返回某些内容,那么您最好的选择通常是将内容放入 cookie 或重定向 URL 的查询字符串中。该 cookie 或查询字符串将与重定向的请求一起发送,服务器可以从那里获取它。

您还可以建立服务器端会话并将数据放入该会话中。这将设置一个会话 cookie,该 cookie 将出现在未来的客户端请求中,然后服务器可以在来自该客户端的未来请求中访问来自服务器端会话对象的数据。


推荐阅读