我对InetAddress.getLocalHost().getHostAddress()有个问题。它可以在大多数机器上正常工作,但在有更多IP地址可用的机器上失败(在这种情况下,“错误的”地址属于VMware网络适配器)。我需要将其放入消息中的地址(然后在服务器上用作应发送响应的地址)。
我知道我可以使用NetworkInterface.getNetworkInterfaces()来获取所有的网络接口,但是我怎样才能通过编程找到正确的接口,以便稍后对服务器可见呢?在我的特殊情况下,客户端和服务器都位于同一公司网络内。
发布于 2013-06-18 15:17:59
如果所有机器都在同一网络中,并且该网络有其IP范围,则可以检查IP是否在该范围内。通常,vmware网络适配器具有192.168.0.x子网中的it如果您的公司范围不同,则应该足够了。
发布于 2013-06-18 15:18:54
也许下面的类可以帮助您解决IP问题
public enum IpAddressHelper
{
X_FORWARDED_FOR("X-Forwarded-For"),
PROXY_CLIENT_IP("Proxy-Client-IP"),
WL_PROXY_CLIENT_IP("WL-Proxy-Client-IP"),
HTTP_CLIENT_IP("HTTP_CLIENT_IP"),
HTTP_X_FORWARDED_FOR("HTTP_X_FORWARDED_FOR");
private static final Logger LOGGER = LoggerFactory.getLogger(IpAddressHelper.class);
private static final String REMOTE_ADDR = "REMOTE_ADDR";
private String key;
/**
* @param key
*/
IpAddressHelper(String key)
{
this.key = key;
}
/**
* @return the key
*/
public String getKey()
{
return key;
}
public static String getClientIpAddr(HttpServletRequest request)
{
String ip = null;
for (IpAddressHelper header : IpAddressHelper.values())
{
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
{
ip = request.getHeader(header.getKey());
LOGGER.info("tried:" + header);
}
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
{
ip = request.getRemoteAddr();
}
return ip;
}
public static String getClientIpAddr(Map<String, String> requestHeaders)
{
String ip = null;
for (IpAddressHelper header : IpAddressHelper.values())
{
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
{
ip = requestHeaders.get(header.getKey());
LOGGER.info("tried:" + header);
}
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
{
ip = requestHeaders.get(REMOTE_ADDR);
}
return ip;
}
}https://stackoverflow.com/questions/17162721
复制相似问题