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

相关推荐
Sheffield12 小时前
Docker的跨主机服务与其对应的优缺点
linux·网络协议·docker
blasit5 天前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
YuMiao5 天前
gstatic连接问题导致Google Gemini / Studio页面乱码或图标缺失问题
服务器·网络协议
Jony_8 天前
高可用移动网络连接
网络协议
chilix8 天前
Linux 跨网段路由转发配置
网络协议
gihigo199810 天前
基于TCP协议实现视频采集与通信
网络协议·tcp/ip·音视频
龙仔72510 天前
在麒麟V10服务器安全加固,sshd防暴力破解加固,实现“密码错误3次封IP”的需求
服务器·tcp/ip·安全
白太岁10 天前
通信:(5) 电路交换、报文交换与分组交换
运维·服务器·网络·网络协议
小扎仙森10 天前
关于阿里云实时语音翻译-Gummy推送WebSocket
websocket·阿里云·云计算
EasyGBS10 天前
国标安全升级:GB28181平台EasyGBS支持GB35114协议的应用场景与核心优势
网络协议·安全·gb28181·gb35114