概述
前段时间项目有用到获取客户端请求的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的开源项目,其中有一个实现地址的方式,就整理下,分享给大家。
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 地址所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复