我正在编写一个lua脚本,将一些数据发送到我使用我的ESP8266 WeMOS LoLin板上的spring-boot开发的webapp。为此,脚本必须首先在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
标头。无论如何,我的问题仍然没有答案,所以,除非管理员告诉我将我的解决方案作为解决方案发布并将问题标记为已解决,否则我将保持开放状态等待有人回答。
答案 0 :(得分:1)
至少it's documented,但行为一直是like that from day 1。因为我没有写那段代码,所以我只能推测“为什么”。因此,这个问题不适合Stack Overflow Q& A风格。
ESP8266是一种非常受限制的设备;记忆 - 或其他。 <= p>,在服务器超时或关闭之前,不保持HTTP连接的活动状态。