【问题标题】:ESP8266 NodeMCU Lua: http.post() includes always "Connection: close" headerESP8266 NodeMCU Lua:http.post() 始终包含“连接:关闭”标头
【发布时间】:2018-02-06 02:51:13
【问题描述】:

我正在编写一个 lua 脚本,将一些数据发送到我使用 spring-boot 从我的 ESP8266 WeMOS LoLin 板上开发的 web 应用程序。为此,脚本必须首先在 webapp 上进行身份验证。问题是当我发布身份验证数据时,我在服务器日志中发现即使身份验证正确完成,会话也关闭了。

这是我的 lua 代码的一部分

    print("Authenticating .........")
    local url = getBaseUrl() .. '/login'

    local body = 'username=' .. config.server.usr .. '&'..
        'password=' .. config.server.pwd .. '&' ..
        'X-CSRF-TOKEN=a65sd464-6666-4bb4-4543-23k234tl234'

    local headers = 
        'Content-Type: application/x-www-form-urlencoded\r\n'..
        'Connection: keep-alive\r\n'..
        'Accept: */*\r\n' ..
        'Cookie: JSESSIONID=F7A9D7FA7D9AF79D7F9ASD7FA97A979F7D7A'


    print(url, "\n", headers, "\n", body)

    http.post(url, headers, body, loginPostCallback)

*X-CSRF-TOKEN 和 JSESSIONID 在这个例子中是虚拟值。在完整脚本中,它们是从先前 GET 请求的响应中获得的

所以我尝试在命令行中使用curl 执行相同的操作,完全没有问题。

curl -v -H "Content-Type: application/x-www-form-urlencoded\r\nConnection: keep-alive\r\nAccept: */*\r\nJSESSIONID=F7A9D7FA7D9AF79D7F9ASD7FA97A979F7D7A" -b "JSESSIONID=F7A9D7FA7D9AF79D7F9ASD7FA97A979F7D7A" -d "X-CSRF-TOKEN=a65sd464-6666-4bb4-4543-23k234tl234&username=admin&password=admin" http://192.168.1.4:8080/login

然后,我在服务器上跟踪请求,并将发送我的 lua 脚本的内容与 curl 发送的内容进行比较,我看到 lua http.post() 始终发送 "Connection: close" 标头,即使我明确设置"Connection: keep-alive" 标头-也包括在内-。

查看我在http.c, line 224 中看到的NodeMCU http 库代码总是包含"Connection: close" 标头。

有人知道他们为什么这样做吗?有没有办法发出"Connection: keep-alive" 请求?

提前致谢

更新

我已经能够在服务器中进行身份验证,使用net 库而不是http 并发送Connection: keep-alive 标头。无论如何,我的问题仍未得到解答,因此,除非管理员告诉我将我的解决方法作为解决方案发布并将问题标记为已解决,否则我将保持打开状态等待有人回答。

【问题讨论】:

  • 抛硬币:为什么服务器要求保持连接有效?会话(可以)跨越多个单独的连接。可能是您在 POST(以及后续请求)时没有发送服务器在第一次响应中发送给您的会话 ID?
  • 嗨 Marcel:服务器需要保持连接活动,因为身份验证是强制性的,服务器确定客户端是否经过身份验证的唯一方法是保持会话活动并检查会话 ID 是否属于到经过身份验证的会话。我很难在不打扰谁试图帮助我的情况下发送完整的脚本,但是我发布的 JSESSIONID 是从 lua 脚本执行的第一个请求的响应中收到的 Set-Cookie 标头中获得的。并且在每个响应中,都会解析 Set-Cookie 标头并更新包含 cookie 的表。
  • 我的意思是维护会话不需要保持连接处于活动状态。 JSESSIONID 不是一个有效且普遍理解的 HTTP 标头,但也许您的服务器确实支持它。一般来说,如果你想在请求中发回会话 cookie,你必须使用Cookie: JSESSIONID=xxx
  • 谢谢马塞尔。也许我应该了解更多关于 http 会话以及如何在保持连接处于活动状态的情况下保持打开状态的信息。我所做的测试表明,如果我的服务器收到“连接:关闭”标头,它就会关闭会话。我将寻找有关 Spring-boot 和 Tomcat 的更多信息。任何建议都将受到欢迎。另外,感谢您的评论,我发现我在发布的示例中复制/粘贴时犯了一个错误:我忘记在“JSESSIONID”之前写“Cookie:”。

标签: spring-boot lua esp8266 nodemcu


【解决方案1】:

至少it's documented,但行为一直是like that from day 1。由于我没有编写该代码,因此我只能推测“为什么”。因此,这个问题不适合 Stack Overflow Q&A 风格。

ESP8266 是一个非常受限的设备;内存和其他。因此,在 HTTP 连接超时或被服务器关闭之前不让它们保持活动状态是有道理的。

【讨论】:

  • 当我找到一种使用Connection: keep-alive 发送http 请求的方法时,这似乎是我将要得到的最接近的答案,为什么http 库会以这种方式工作,我将其标记为解决方案。
猜你喜欢
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
相关资源
最近更新 更多