我正在编写一个需要处理丢失连接的网络客户端。
如果您使用 HTTPS 连接到服务器并且 Internet 连接断开,服务器会丢失会话信息吗?
互联网连接恢复后,客户端需要重新登录服务器还是依赖服务器?
通常,服务器确定会话的生存时间(通过定义会话超时)以及会话(如果有的话)在单个请求之间的持久性。服务器将带有会话信息(会话密钥)的 cookie 发送回客户端,因此当客户端发送包含会话 cookie 的下一个请求时,服务器知道要使用哪个会话。
话虽如此 - 两个请求之间没有信息,同时互联网连接是否丢失。只要服务器仍然有会话并且客户端仍然有相应的 cookie,一切都应该按预期工作。
另一方面,即使连接完全没有中断并且服务器和客户端都启动并运行,但没有相互交谈(即没有请求),会话可能会因为简单的超时而丢失服务器端。
因此,在服务器上,您可能会收到对受保护资源或需要特定会话状态的资源的请求——并且没有这样的会话。在客户端,您总是可能会收到表明需要登录的响应。
这两种情况都必须正确实施。
HTTP 协议本身是无状态的,即每个请求都按原样提供,与之前的或未来的请求没有任何关系。
为了克服这个问题,您可以使用客户端 Cookie。您的 cookie 可以保留一个会话状态标识符,该标识符可以在连接断开后发送回服务器以恢复先前的状态。
除此之外,您还可以构建一个会话管理模块来处理会话持久性。
首先,这取决于您正在谈论的会话类型:
正如您所料,没有简单的答案。因为它取决于很多点。
正如其他人已经说过的那样,您可以通过使用 SessionID 来“保持”连接,建议将其存储在 cookie 中。大多数现代环境(如 PHP 和 ASP.NET)都使用这种机制来处理丢失的连接。
有关实施安全会话管理的安全注意事项,请参阅https://www.owasp.org/index.php/Session_Management_Cheat_Sheet。
此外,您可以使用 SSL 执行的操作是使用客户端证书构建会话管理。用户由颁发给他的唯一证书来识别。这样做的好处是客户端不必先登录。另一方面,您必须向每个客户颁发客户证书,这可能很复杂。
使用 cookie 存储会话信息,一旦连接丢失,您可以轻松地从 cookie 中获取信息。使用条件调用cookie,即如果会话丢失调用cookie。使用php在session中存储信息并调用cookie