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

相关推荐
iナナ12 小时前
传输层协议——UDP和TCP
网络·网络协议·tcp/ip·udp
舒一笑13 小时前
Mac 上安装并使用 frpc(FRP 内网穿透客户端)指南
后端·网络协议·程序员
搬码临时工17 小时前
端口映射原理操作详解教程:实现外网访问内网服务,本地路由器端口映射公网ip和软件端口映射域名2种方法
网络·tcp/ip·智能路由器
Mr_Xuhhh17 小时前
NAT、代理服务、内网穿透
网络·网络协议·http·https·udp·智能路由器
用户849137175471619 小时前
为什么大模型都离不开SSE?带你搞懂第1章〈SSE技术基础与原理〉
前端·网络协议·llm
励志五个月成为嵌入式糕手21 小时前
0819 使用IP多路复用实现TCP并发服务器
java·服务器·tcp/ip
王燕龙(大卫)1 天前
tcp会无限次重传吗
网络·tcp/ip
weisian1511 天前
HTTP协议-3-HTTP/2是如何维持长连接的?
网络·网络协议·http
tan77º2 天前
【项目】分布式Json-RPC框架 - 项目介绍与前置知识准备
linux·网络·分布式·网络协议·tcp/ip·rpc·json
墨雨听阁2 天前
8.18网络编程——基于UDP的TFTP文件传输客户端
网络·网络协议·学习·udp