获得访问 controller 端口的客户端 ip 地址 import javax.servlet.http.HttpServletRequest; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; /** * <p> * This method helps to get remote ip. * </p> * * @return The remote ip. * @throws RuntimeException If get ip failed. */ public static String getRemoteIp() { HttpServletRequest request = null; try { request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); } catch (Exception e) { System.out.println("Can not get current IP."); } return request.getRemoteAddr(); }
获得访问 endpoint 端口的客户端 ip 地址 新建一个配置类,继承 Configurator。 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; /** * <p> * This is static class that provides configuration properties for server endpoint. * </p> * * <p> * <strong>Thread Safety: </strong> This class is immutable and thread safe. * </p> * * @author * @version 1.0.0 */ public class ServletAwareConfigurator extends Configurator { /** * <p> * The key for client ip. * </p> */ private static final String CLIENT_IP_KEY = "CLIENT_IP"; /** * <p> * The method helps to get clientIp. * </p> */ @Override public void modifyHandshake(ServerEndpointConfig config, HandshakeRequest request, HandshakeResponse response) { HttpServletRequest httpservletRequest = getField(request, HttpServletRequest.class); String clientIP = httpservletRequest.getRemoteAddr(); config.getUserProperties().put(CLIENT_IP_KEY, clientIP); } /** * <p> * The method is hacking reflector to expose fields. * </p> * * @param <I> The instance class * @param <F> The field type class * @param instance The instance. * @param fieldType The type for field. * @return The fieldType. */ 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) { System.out.println( "Have no access to define the specified class, field, method or constructor."); return null; } }
在 endpoint 定义处配置 serverEndpoint 为刚才自定义的类。 import javax.websocket.Session; import ServletAwareConfigurator; @ServerEndpoint(value = "/andriod_client", configurator = ServletAwareConfigurator.class) @Component public class AndriodClientController { /** * <p> * The key for client ip. * </p> */ private static final String CLIENT_IP_KEY = "CLIENT_IP"; public String getIp(Session session){ String clientIp = "N/A"; if (session.getUserProperties() != null && session.getUserProperties().get(CLIENT_IP_KEY) != null) { clientIp = String.valueOf(session.getUserProperties().get(CLIENT_IP_KEY)); } } }
根据服务器的主机名获得 ip 地址,并拼接成可以直接访问的链接 /** * <p> * This method helps to get host address. * </p> * * @param serverAddress The server address. * @param serverApi The server api. * @return The host address. * @throws IllegalArgumentException if the argument does not meet requirement. * @throws UnknownHostException if host name is invliad. * @throws MalformedURLException if url is invliad. */ public static String getHostNameAddress(String serverAddress, String serverApi) throws UnknownHostException, MalformedURLException { ParameterCheckUtility.checkNotNullNorEmptyAfterTrimming(serverAddress, "serverAddress"); ParameterCheckUtility.checkNotNull(serverApi, "serverApi"); serverAddress = serverAddress.trim(); StringBuilder url = new StringBuilder(); URL serverUrl = new URL(serverAddress); String protocol = serverUrl.getProtocol(); String hostName = serverUrl.getHost(); String hostNameAddress = InetAddress.getByName(hostName).getHostAddress(); url.append(protocol); url.append("://"); url.append(hostNameAddress); int port = serverUrl.getPort(); if (port != -1) { url.append(":"); url.append(port); } url.append("/"); url.append(serverApi.trim()); return url.toString(); }