今天用到websocket,希望服務器端在連接建立時獲取到客戶端的IP,看了源碼沒有找到提供的api,后來一頓百度,在stackoverflow 找到了解決方案,經(jīng)過測試可以使用,總結(jié)了一下, 下邊是代碼:
- import java.lang.reflect.Field;
- import java.net.InetSocketAddress;
- import javax.websocket.RemoteEndpoint.Async;
- import javax.websocket.Session;
- public class WebsocketUtil {
- public static InetSocketAddress getRemoteAddress(Session session) {
- if (session == null) {
- return null;
- }
- Async async = session.getAsyncRemote();
- //在Tomcat 8.0.x版本有效
- // InetSocketAddress addr = (InetSocketAddress) getFieldInstance(async,"base#sos#socketWrapper#socket#sc#remoteAddress");
- //在Tomcat 8.5以上版本有效
- InetSocketAddress addr = (InetSocketAddress) getFieldInstance(async,"base#socketWrapper#socket#sc#remoteAddress");
- return addr;
- }
- private static Object getFieldInstance(Object obj, String fieldPath) {
- String fields[] = fieldPath.split("#");
- for (String field : fields) {
- obj = getField(obj, obj.getClass(), field);
- if (obj == null) {
- return null;
- }
- }
- return obj;
- }
- private static Object getField(Object obj, Class<?> clazz, String fieldName) {
- for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
- try {
- Field field;
- field = clazz.getDeclaredField(fieldName);
- field.setAccessible(true);
- return field.get(obj);
- } catch (Exception e) {
- }
- }
- return null;
- }
- }
調(diào)用測試:
- /**
- * 連接建立成功調(diào)用的方法*/
- @OnOpen
- public void onOpen(Session session) {
- InetSocketAddress remoteAddress = WebsocketUtil.getRemoteAddress(session);
- System.out.println("有新連接加入!" + remoteAddress);
- }
輸出結(jié)果: