Spring boot ESP8266 NodeMCU Lua:http.post()始终包含“Connection:close”头
我正在编写一个lua脚本,将一些数据发送到我从ESP8266 WeMOS LoLin板使用spring boot开发的webapp。为此,脚本必须首先在webapp上进行身份验证。问题是,当我发布身份验证数据时,我在服务器日志中发现,即使身份验证已正确完成,会话也已关闭 这是我的lua代码的一部分Spring boot ESP8266 NodeMCU Lua:http.post()始终包含“Connection:close”头,spring-boot,lua,esp8266,nodemcu,Spring Boot,Lua,Esp8266,Nodemcu,我正在编写一个lua脚本,将一些数据发送到我从ESP8266 WeMOS LoLin板使用spring boot开发的webapp。为此,脚本必须首先在webapp上进行身份验证。问题是,当我发布身份验证数据时,我在服务器日志中发现,即使身份验证已正确完成,会话也已关闭 这是我的lua代码的一部分 print("Authenticating .........") local url = getBaseUrl() .. '/login' local body = 'us
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头(也包括它)
查看我在中看到的NodeMCU http库代码总是包含Connection:close头
有人知道他们为什么这么做吗?有没有办法建立连接:保持活动请求
提前谢谢
使现代化
我已经能够在服务器上进行身份验证,使用网络库而不是http,并发送Connection:keep-alive头。无论如何,我的问题仍然没有得到回答,因此,除非管理员告诉我将我的变通方法发布为解决方案,并将问题标记为已解决,否则我会让它保持打开状态,等待有人回答。至少是这样的行为。由于我没有写那段代码,我只能猜测原因。因此,这个问题不适合堆栈溢出问答风格
ESP8266是一个非常受限的设备;记忆——还有其他。因此,在HTTP连接超时或被服务器关闭之前不保持其活动状态是有意义的。抛硬币:为什么服务器需要保持连接活动状态?会话可以跨越多个单独的连接。可能是您在发布请求和后续请求时没有发送服务器在其第一次响应中发送给您的会话id吗?Hi Marcel:服务器要求保持连接处于活动状态,因为身份验证是必需的,服务器确定客户机是否经过身份验证的唯一方法是保持会话活动并检查会话ID是否属于经过身份验证的会话。我很难发送完整的脚本而不打扰谁来帮助我,但是我发布的JSESSIONID是从lua脚本执行的第一个请求的响应中收到的一个Set Cookie头中获取的。在每个响应中,都会解析Set Cookie头并更新包含Cookie的表。我的观点是,维护会话不需要保持连接处于活动状态。JSESSIONID不是一个有效且通常理解的HTTP头,但您的服务器可能确实支持它。通常,如果要在请求中发回会话cookie,必须使用cookie:JSESSIONID=xxx。谢谢Marcel。也许我应该学习更多关于http会话的知识,以及如何保持它的开放性,而不考虑保持连接的活动性。我所做的测试显示,如果服务器接收到Connection:close头,它将关闭会话。我将寻找关于Spring boot和Tomcat的更多信息。欢迎提出任何建议。此外,由于您的评论,我发现我在发布的示例中复制/粘贴时犯了一个错误:我忘了编写Cookie:Preference JSSessionID。当我找到一种使用Connection:keep alive发送http请求的方法时,这似乎是我将要得到的最接近http库为何以这种方式工作的答案,我将其标记为解决方法。