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调用

相关推荐
程序猿编码1 分钟前
网络数据包环形缓存捕获技术:原理、设计与实现(C/C++代码实现)
linux·c语言·网络·tcp/ip·缓存
安静轨迹11 小时前
TLS_SSL 警报码完整手册
网络·网络协议·ssl
2501_9216494914 小时前
期货 Tick 级数据与基金净值历史数据 API 接口详解
开发语言·后端·python·websocket·金融·区块链
独断万古他化15 小时前
【Java 实战项目】多用户网页版聊天室:消息传输模块 —— 基于 WebSocket 实现实时通信
java·spring boot·后端·websocket·ajax·mybatis
F1FJJ17 小时前
Shield CLI PostgreSQL 插件现已上架 VS Code 扩展市场
网络·vscode·网络协议·postgresql·开源软件
liulilittle18 小时前
OPENPPP2 sysnat loader implement / C/C++
服务器·c语言·开发语言·网络·c++·tcp/ip
jinanwuhuaguo19 小时前
OpenClaw全网使用人群全景深度分析报告
网络·人工智能·网络协议·rpc·openclaw
努力的lpp19 小时前
小迪安全第10天:HTTP数据包分析与构造
网络协议·安全·http
带娃的IT创业者20 小时前
WeClaw_41_桌面端与PWA文件双向传输:WebSocket与HTTP混合协议设计
websocket·网络协议·http·文件传输·pwa
i建模21 小时前
python, conda SSL证书错误修复及conda更新
网络协议·conda·ssl