问题描述
我在做登录的时候作了个记录客户端的登录机器名和ip,但是有的时候登录特别慢,我跟踪了下代码,发现慢的地方在根据IP地址获得机器名这段代码。但是我查了好久没有找到原因,请高手们指点一下。下面是我的代码:第一个方法获得IP地址,第二个方法是通过上面获得IP得到机器名。privatestaticStringgetClientIpAddr(HttpServletRequestrequest){//分不同的特殊情况获取用户客户端ip地址Stringip=request.getHeader("X-Forwarded-For");if(ip==null||ip.length()==0||"unknown".equalsIgnoreCase(ip)){ip=request.getHeader("Proxy-Client-IP");}if(ip==null||ip.length()==0||"unknown".equalsIgnoreCase(ip)){ip=request.getHeader("WL-Proxy-Client-IP");}if(ip==null||ip.length()==0||"unknown".equalsIgnoreCase(ip)){ip=request.getHeader("HTTP_CLIENT_IP");}if(ip==null||ip.length()==0||"unknown".equalsIgnoreCase(ip)){ip=request.getHeader("HTTP_X_FORWARDED_FOR");}if(ip==null||ip.length()==0||"unknown".equalsIgnoreCase(ip)){ip=request.getRemoteAddr();}returnip;}privatestaticStringgetClientComputerName(HttpServletRequestrequest,Stringip){StringclientHostName=null;try{clientHostName=InetAddress.getByName(ip).getHostName();}catch(UnknownHostExceptione){logger.error("获取客户端机器名失败,客户端ip地址为:"+ip);e.printStackTrace();}returnclientHostName;}StringipAddress=getClientIpAddr(request);StringcomputerName=getClientComputerName(request,ipAddress);
解决方案
解决方案二:
为什么要根据IP获得机器名呢?慢的原因可能是要做反向DNS查询,但一般都不配的。。。。
解决方案三:
这是InetAddress提供的方法;但是我部署环境都一样在一个地方没问题但是在另外一套环境就特别慢
解决方案四:
有什么解决办法吗?
解决方案五:
引用2楼MINGHUI119的回复:
这是InetAddress提供的方法;但是我部署环境都一样在一个地方没问题但是在另外一套环境就特别慢
你不能说这个方法是JDK里面某个类提供的,就觉得和你无关了。其实所有的东西都是在你自己的环境里运行的,有些东西,你要知其所以然。那你两边的环境是不是都是DHCP的呢?DHCP的服务器是不是都一样呢?然后客户端的IP地址是不是都在一个段内呢?是不是通过公网过来呢?
解决方案六:
最快的办法么,把你这些要访问的IP地址全部写在你的host文件里。。。
解决方案七:
都写到host,这个办法肯定不行,客户量太大,而且IP都是自动获得。这边用的都是虚拟环境,都是克隆过去的;
解决方案八:
同求.....
解决方案九:
这问题没有遇到过!
解决方案十:
引用6楼MINGHUI119的回复:
都写到host,这个办法肯定不行,客户量太大,而且IP都是自动获得。这边用的都是虚拟环境,都是克隆过去的;
所以,你看一下DHCP的服务器是不是都配置反向解析。另外,我个人觉得这个功能基本上没什么意思。。。。
解决方案十一:
这个解析没什么意义
解决方案十二:
这个解析没什么意义+1
解决方案十三:
java.net.InetAddress类的getHostName方法用来获取某一IP地址的主机名。返回结果:此IP地址的主机名;如果安全检查不允许操作,则返回IP地址的文本表示形式。1.如果不能立即获取主机名,程序会继续尝试一段时间,若干时间后标志为失败,然后返回IP地址。2.由于并不是总能成功获取,因此可能会出现长时间等待的情况,这个时间大概有十几秒钟。在编写实时的网络程序时,应该注意这个问题。如果允许,尽量采用IP地址代替主机名称。3.即使通过getHostName方法成功获取主机名称,不同的平台的主机名的格式也是不同的。在编写跨平台的网络程序时,应该注意这个问题。
解决方案十四:
有没有能够替换的方法,不通过java.net.InetAddress类的getHostName方法用来获取某一IP地址的主机名;求高手指教!!!
解决方案十五:
引用13楼MINGHUI119的回复:
有没有能够替换的方法,不通过java.net.InetAddress类的getHostName方法用来获取某一IP地址的主机名;求高手指教!!!
这个讨论真心没意义。如果网络不在你的应用控制范围内,你拿了没有意义。如果在你控制范围内,那么DNS的反向解析配置好就可以,包括DHCP,也是可以配置的。
解决方案:
LZ你确定你理解”主机名“这个概念的定义吗?