websocket获取客服端真实ip

在websocket建立连接时,获取访问客户端的真实ip

1. websocket建立连接过程

2. pom依赖

java 复制代码
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>

3. 添加配置,握手过程中,设置真实客户端ip

java 复制代码
import javax.servlet.http.HttpServletRequest;
import javax.websocket.HandshakeResponse;
import javax.websocket.server.HandshakeRequest;
import javax.websocket.server.ServerEndpointConfig;
import java.lang.reflect.Field;

public class WebSocketIpConfigurator extends ServerEndpointConfig.Configurator {
    @Override
    public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
        try {
            // 通过反射获取底层 ServletRequest
            Field requestField = request.getClass().getDeclaredField("request");
            requestField.setAccessible(true);
            HttpServletRequest httpRequest = (HttpServletRequest) requestField.get(request);

            // 解析真实 IP
            String clientIp = IpUtils.getClientIp(httpRequest);
            sec.getUserProperties().put("clientIp", clientIp);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
class IpUtils {
    public static String getClientIp(HttpServletRequest request) {
        String ip = request.getHeader("X-Forwarded-For");
        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }

        // 处理多级代理(取第一个 IP)
        if (ip != null && ip.contains(",")) {
            ip = ip.split(",")[0].trim();
        }
        return ip;
    }
}

4. websocket建立连接时,加载配置,设置ip

5. 获取真实ip调用

相关推荐
丘山子5 分钟前
一些鲜为人知的 IP 地址怪异写法
前端·后端·tcp/ip
半路_出家ren42 分钟前
流量抓取工具(wireshark)
网络·网络协议·测试工具·网络安全·wireshark·流量抓取工具
HH牛码1 小时前
通讯的基础概念:涵盖串行通信、并行通信、TCP、UDP、Socket 等关键概念和技术
tcp/ip·udp
Gazer_S2 小时前
【HTTP/2:信息高速公路的革命】
网络·网络协议·http
lLinkl2 小时前
项目笔记2:post请求是什么,还有什么请求
服务器·网络协议·http
李匠20242 小时前
C++ RPC以及cmake
网络·c++·网络协议·rpc
小厂永远得不到的男人3 小时前
基于 Trae 的 WebSocket 聊天室保姆级教程(超详细版)
websocket·全栈·trae
小厂永远得不到的男人4 小时前
WebSocket深度剖析:实时通信的终极解决方案实践指南
后端·websocket
花千树-0105 小时前
使用 Frp 同时实现 HTTP 和 HTTPS 内网穿透
网络协议·http·https
夜空晚星灿烂5 小时前
http通信之axios vs fecth该如何选择?
网络·网络协议·http