我是靠谱客的博主 和谐小伙,这篇文章主要介绍获取ipv4、v6 地址,现在分享给大家,希望可以做个参考。

前段时间项目有用到获取客户端请求的ip地址,随在网上搜了下大致的java实现过程,看到的都是通过请求中得到的ip地址,像request.getRemoteAddr()等获取方式,当考虑Apache,Squid等反向代理,多次代理会有多个ip,第一个才是真实的ip,大致的代码实现过程如下:
public static String getBrowIp(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
int port = request.getRemotePort();
if(ip != null && ip !="" && !"unKnown".equalsIgnoreCase(ip)){
//多次反向代理后会有多个ip值,第一个ip才是真实ip
int index = ip.indexOf(",");
if(index != -1){
return ip.substring(0,index);
}else{
return ip;
}
}
ip = request.getHeader("X-Real-IP");
if(ip != null && ip !="" && !"unKnown".equalsIgnoreCase(ip)){
return ip;
}
return request.getRemoteAddr();
}

此种方法虽然能实现所需要的功能,但有一个小缺陷,就是在win10系统中获取的地址为“0:0:0:0:0:0”,即是一个ipv6地址。
不得不重新想办法实现,在github中看到zipkin的开源项目,其中有一个实现地址的方式,就整理下,分享给大家。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Endpoint produceLocalEndpoint() { Endpoint.Builder builder = Endpoint.newBuilder().serviceName("unknown"); try { Enumeration<NetworkInterface> nics = NetworkInterface.getNetworkInterfaces(); if (nics == null) return builder.build(); while (nics.hasMoreElements()) { NetworkInterface nic = nics.nextElement(); Enumeration<InetAddress> addresses = nic.getInetAddresses(); while (addresses.hasMoreElements()) { InetAddress address = addresses.nextElement(); if (address.isSiteLocalAddress()) { builder.ip(address); break; } } } } catch (Exception e) { // don't crash the caller if there was a problem reading nics. if (logger.isLoggable(Level.FINE)) { logger.log(Level.FINE, "error reading nics", e); } } return builder.build(); }

此功能可以实现同时获取ipV4 ,ipV6 ,端口的对应值,是大家以后遇到此类问题的不错解决方案。

最后

以上就是和谐小伙最近收集整理的关于获取ipv4、v6 地址的全部内容,更多相关获取ipv4、v6内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部