【问题标题】:Unable to access cookie in nodeJS after redirected from HTML page从 HTML 页面重定向后无法访问 nodeJS 中的 cookie
【发布时间】:2021-01-04 09:22:56
【问题描述】:

我正在尝试通过 html 页面进行发布调用。在第二个应用程序中,我正在尝试访问一个名为 cookie_test 的 cookie(可以手动设置或通过浏览器中的代码设置)。

在应用程序选项卡(存储 --> cookie)下,我可以看到 cookie,但是当我尝试从第二个应用程序访问它时,不知何故我在控制台日志中未定义(参考第二个代码)。

browser cookie screenshot

应用程序一(test.html 是其中唯一的文件,我正在尝试进行后期调用)

<form action="http://localhost:3000/page-two" method="POST">
    <input type="submit" value="Go to P2">
</form>

应用二(NodeJS/Express: index.js)

var express = require('express');
var router = express.Router();

router.post('/', function (req, res, next) {
    console.log("COOKIE-TEST::::::", req.cookies.cookie_test)
    res.render("page_two", { cookie_data: req.cookies.cookie_test });
});

module.exports = router;

注意:在节点应用程序中,cookie 可以访问并按预期工作。重定向期间似乎出现问题。

【问题讨论】:

  • 查看 devtools 的“网络”选项卡会很有帮助。它显示在每个请求中发送并在响应中返回的 cookie。还有一个名为“编辑此 Cookie”的 Chrome 网络扩展程序,可以很好地查看浏览器中的 cookie。
  • 问题:应用程序二来自http://localhost:3000。应用程序一从哪里提供服务?
  • @O.Jones,应用程序一现在是一个简单的 HTML 页面。我注意到的一件事是网络选项卡下的请求标头中缺少 Cookie 标头。我担心的是,每当用户来到 App. 2、代码应该可以访问现有的cookies。
  • 我再问一次。应用程序一从哪里提供?您可能会遇到跨域 cookie 限制。
  • @O.Jones,应用程序。一个不是从任何地方提供的。我只是在浏览器上打开 HTML 文件(上面的代码)。

标签: html node.js cookies


【解决方案1】:

有几件事要检查。

首先,如果要从用户浏览器接收任何 cookie,您的 nodejs 应用程序需要 cookie-parser middleware。看起来像这样。

var cookieParser = require('cookie-parser')
...
var express = require('express')
express.use(cookieParser())
...

你没有提到你是如何从你的帖子路由中设置 cookie 的。你可以通过调用res.cookie() 来做到这一点:

router.post('/', function (req, res, next) {
    console.log("COOKIE-TEST::::::", req.cookies.cookie_test)
    const testCookieVal = req.cookies.cookie_test || 'some default value'
    res.cookie('cookie_test', testCookieVal)
    res.render("page_two", { cookie_data: someCookieVal })
});

目前尚不清楚您是如何在发布路线中设置要检索的 cookie。您应该了解,您的应用程序一 html 文件是从 file:// 源提供的,而应用程序二是从 https://localhost:3000 源提供的。浏览器从不在向其他来源的请求中发送与从一个来源提供的网页相关联的 cookie。

【讨论】:

  • 1. cookie-parser 作为中间件就位。 2.在上述路由方法中,我首先会检查用户是否存在特定的cookie。如果没有,将用户重定向到登录页面,然后验证用户并使用 res.cookie() 设置一个 cookie,maxAge 为 5-6 小时。 3. 现在让我们假设用户关闭选项卡并通过应用程序一的表单提交再次重新访问该页面。即使在那个时候,有效的 cookie 在浏览器中也存在,但在 req.cookie 方法中无法访问。 4. 我知道一个网站不会向其他应用发送 cookie,但至少第二个应用应该能够访问其 cookie
【解决方案2】:

我能够通过将 cookie 参数设置为 secure(true) 和 sameSite(none) 来解决这个问题。确保为 sameSite 属性使用最新版本的 express。此设置允许我的第二个应用程序访问它的 cookie,而不管从任何来源(在我的情况下是应用程序一个)重定向。

【讨论】:

  • 真的很有帮助
猜你喜欢
  • 2020-04-05
  • 2012-02-20
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 2013-12-22
  • 2011-08-07
  • 1970-01-01
  • 2015-03-25
相关资源
最近更新 更多