在websocket建立連接時,獲取訪問客戶端的真實ip
1. websocket建立連接過程
2. pom依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>
3. 添加配置,握手過程中,設置真實客戶端ip
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 {@Overridepublic void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {try {// 通過反射獲取底層 ServletRequestField requestField = request.getClass().getDeclaredField("request");requestField.setAccessible(true);HttpServletRequest httpRequest = (HttpServletRequest) requestField.get(request);// 解析真實 IPString 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調用