在使用 Socket.io 进行服务器与客户端通信的时候,了解客户端的 IP 地址对于定位问题及进行一些安全控制非常重要。本文将介绍如何在 Socket.io 中获取客户端的 IP 地址,希望能对前端开发者有所帮助。
Socket.io 简介
Socket.io 是一个基于 WebSocket 封装的实时双向通信库,可以在浏览器和服务器之间实现实时通信。同其他的 WebSocket 库不同,Socket.io 具有跨浏览器和跨操作系统的 API,使得浏览器和服务器之间建立通信非常容易。这里不再详细介绍 Socket.io 的基础知识。
获取客户端的 IP 地址
Socket.io 中可以通过 socket.request.connection.remoteAddress
获取客户端的 IP 地址。这个属性同时适用于 HTTP 和 WebSocket 连接。示例代码如下:
-- -------------------- ---- ------- ----- --- - -------------------------------------- ----- -- - -------------------------- --------------- -------- ------------ ---- - -- ---- ---- -- -- ------------------- -------- -- - ---------------- ---------- ---- - - ----------------------------------------- ---
在上述示例中,当有新的连接建立时,输出 New connection from xxx.xxx.xxx.xxx
的信息以标识连接的 IP 地址。
但是需要注意的是,socket.request.connection.remoteAddress
并不能保证总是能获取正确的客户端 IP 地址。因为在节点网关 (NGINX、Apache,到 Express、Koa 等后端) 的反向代理下,如果代理服务器没有将请求头 X-Forwarded-For
设置为客户端 IP 地址,可能上述方法获取到的是代理服务器的 IP 地址。如果需要在反向代理下准确获取客户端的真实IP地址,可以通过访问请求头中的 X-Forwarded-For
属性,该属性是一个包含了客户端IP地址的由逗号划分的值。我们可以通过 socket.handshake.headers['x-forwarded-for']
获取到。 如果需要处理多级反向代理,应该去查找第一个非内部地址,例如:
-- -------------------- ---- ------- -------- ------------------- - --- ------ - -------------------------------------------- -- -------- - ----- ---- - ------------------ --- ---- - - -- - - ------------ ---- - -- -------- -- ---------------------- - ------ - -------- ------ - - - ---- - ------ - ---------------------------------------- - ------ ------- - -------- --------------- - ------ ------------------------------------------------------------------------------- -
上述实现依赖了内部 isPrivateIp
函数,用于判断是否是内部地址(10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,IPv6 中的 ::1),如果不是,直接返回该地址,否则继续查找下一个地址。
总结
本文介绍了如何在 Socket.io 中获取客户端的 IP 地址,强调了在反向代理下获取客户端的真实IP地址。希望本文内容对前端开发者有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645c9a69968c7c53b0f07e47