Basato su link1 e link2
ho finalmente capito che possiamo ottenere l'IP del client con le seguenti due classi, in realtà si può fare di più con l'esposto HttpServletRequest ...
ServletAwareConfigurator .JAVA
package examples;
import java.lang.reflect.Field;
import javax.servlet.http.HttpServletRequest;
import javax.websocket.HandshakeResponse;
import javax.websocket.server.HandshakeRequest;
import javax.websocket.server.ServerEndpointConfig;
import javax.websocket.server.ServerEndpointConfig.Configurator;
public class ServletAwareConfigurator extends ServerEndpointConfig.Configurator {
@Override
public void modifyHandshake(ServerEndpointConfig config, HandshakeRequest request, HandshakeResponse response) {
HttpServletRequest httpservletRequest = getField(request, HttpServletRequest.class);
String sClientIP = httpservletRequest.getRemoteAddr();
config.getUserProperties().put("clientip", sClientIP);
// ...
}
//hacking reflector to expose fields...
private static < I, F > F getField(I instance, Class <F> fieldType) {
try {
for (Class <?> type = instance.getClass(); type != Object.class; type = type.getSuperclass()) {
for (Field field: type.getDeclaredFields()) {
if (fieldType.isAssignableFrom(field.getType())) {
field.setAccessible(true);
return (F) field.get(instance);
}
}
}
} catch (Exception e) {
// Handle?
}
return null;
}
}
G etHttpSessionSocket.java
package examples;
import java.io.IOException;
import javax.servlet.http.HttpSession;
import javax.websocket.EndpointConfig;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint(value = "/example",
configurator = ServletAwareConfigurator.class)
public class GetHttpSessionSocket {
private Session wsSession;
private String sClientIP;
@OnOpen
public void open(Session session, EndpointConfig config) {
this.wsSession = session;
this.sClientIP = (String) config.getUserProperties()
.get("clientip");
}
@OnMessage
public void echo(String msg) throws IOException {
wsSession.getBasicRemote().sendText(msg);
}
}
vedere il capitolo 4.1.1.5 a https://tyrus.java.net/documentation/1.9/user-guide.html#d0e464. Richiede una certa quantità di lavoro per ottenere le informazioni da ServerEnpointConfig.Configurator all'istanza dell'endpoint, ma è possibile farlo. (https://github.com/tyrus-project/tyrus/blob/e7d822d3aee4dcdcf2df0b0ed7c70123ad9023c5/tests/e2e/standard-config/src/test/java/org/glassfish/tyrus/test/standard_config/ModifyRequestResponseHeadersTest.java) –
@PavelBucek - Grazie! sembra un sacco di lavoro solo per ottenere informazioni semplici. Ad ogni modo, puoi postare il tuo commento come risposta per favore? – gauravphoenix