我正在使用这个 Websocket 库和这里的示例来创建基于 websockets 的多个服务。
接收请求的主服务器是 Nginx 服务器,它根据请求的来源(基于域)转发请求,因此我可以确定收到的请求是针对 websocket 的。
然而问题出在这里:
public void onOpen(WebSocket ws, ClientHandshake handshake) {
System.out.println("-------------------------------");
System.out.println(ws.getRemoteSocketAddress());
System.out.println("-------------------------------");
}
getRemoteSocketAddress将始终返回 nginx 服务器 IP,类似于/192.168.1.100:43556
我的nginx配置是:
server{
listen 80;
server_name we.mydomain.com;
access_log /var/log/nginx/access-ws-debug.log;
error_log /var/log/nginx/error-ws-debug.log;
set_real_ip_from 192.168.1.0/24;
real_ip_header X-Real-IP;
real_ip_recursive on;
location / {
proxy_pass http://192.168.1.101:54321;
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host; #host
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Y-Real-IP $realip_remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_connect_timeout 1d;
proxy_send_timeout 1d;
proxy_read_timeout 1d;
}
}
nxing的配置有问题吗?或者有没有其他方法可以获取websocket背后用户的IP?
感谢马克的回答解决了。以下代码与提到的库无关。它是jsp 中没有任何库的“经典”Web 实现。
我将握手修改为如下所示:
@Override
public void modifyHandshake(
ServerEndpointConfig config,
HandshakeRequest request,
HandshakeResponse response
) {
HttpSession httpSession = (HttpSession) request.getHttpSession();
config.getUserProperties().put(HttpSession.class.getName(), httpSession);
config.getUserProperties().put("Headers",request.getHeaders());
}
要获取标题,只需在 OnOpen 中调用它:
@OnOpen
public void onOpen(final Session session, EndpointConfig config){ //This happens when javascript opens socket session
Object list = config.getUserProperties().get("Headers");
System.out.println("-------------------------------------");
System.out.println(list);
System.out.println("-------------------------------------");
}
慕工程0101907
相关分类