JAVA如何获取客户端IP地址和MAC地址
本文介绍了JAVA如何获取客户端IP地址和MAC地址,分享给大家,具体如下:
1.获取客户端IP地址
publicStringgetIp(HttpServletRequestrequest)throwsException{ Stringip=request.getHeader("X-Forwarded-For"); if(ip!=null){ if(!ip.isEmpty()&&!"unKnown".equalsIgnoreCase(ip)){ intindex=ip.indexOf(","); if(index!=-1){ returnip.substring(0,index); }else{ returnip; } } } ip=request.getHeader("X-Real-IP"); if(ip!=null){ if(!ip.isEmpty()&&!"unKnown".equalsIgnoreCase(ip)){ returnip; } } returnrequest.getRemoteAddr(); }
为什么不直接使用request.getRemoteAddr();而要在之前判断两个请求头"X-Forwarded-For"和"X-Real-IP"
X-Forwarded-For:client1,proxy1,proxy2,proxy3
其中的值通过一个逗号+空格把多个IP地址区分开,最左边(client1)是最原始客户端的IP地址,代理服务器每成功收到一个请求,就把请求来源IP地址添加到右边。
所有我们只取第一个IP地址
X-Real-IP,一般只记录真实发出请求的客户端IP
解决用localhost访问ip为0:0:0:0:0:0:0:1的问题
publicStringgetIp(HttpServletRequestrequest)throwsException{ Stringip=request.getHeader("X-Forwarded-For"); if(ip!=null){ if(!ip.isEmpty()&&!"unKnown".equalsIgnoreCase(ip)){ intindex=ip.indexOf(","); if(index!=-1){ returnip.substring(0,index); }else{ returnip; } } } ip=request.getHeader("X-Real-IP"); if(ip!=null){ if(!ip.isEmpty()&&!"unKnown".equalsIgnoreCase(ip)){ returnip; } } ip=request.getHeader("Proxy-Client-IP"); if(ip!=null){ if(!ip.isEmpty()&&!"unKnown".equalsIgnoreCase(ip)){ returnip; } } ip=request.getHeader("WL-Proxy-Client-IP"); if(ip!=null){ if(!ip.isEmpty()&&!"unKnown".equalsIgnoreCase(ip)){ returnip; } } ip=request.getRemoteAddr(); returnip.equals("0:0:0:0:0:0:0:1")?"127.0.0.1":ip; }
2.获取客户端MAC地址
UdpGetClientMacAddrumac=newUdpGetClientMacAddr(sip); Stringsmac=umac.GetRemoteMacAddr();
添加一个获取MAC的时间限制
finalUdpGetClientMacAddrumac=newUdpGetClientMacAddr(sip); //---长时间获取不到MAC地址则放弃 ExecutorServiceexec=Executors.newFixedThreadPool(1); Callablecall=newCallable (){ publicStringcall()throwsException{ returnumac.GetRemoteMacAddr(); } }; try{ Future future=exec.submit(call); Stringsmac=future.get(1000*1,TimeUnit.MILLISECONDS); loginMonitor.setMacAddress(smac); }catch(TimeoutExceptionex){ loginMonitor.setMacAddress("获取失败"); logger.info("获取MAC地址超时"); ex.printStackTrace(); } //关闭线程池 exec.shutdown(); //---
需要先获取IP地址作为参数构造一个UdpGetClientMacAddr
UdpGetClientMacAddr.java
packageshmc.commonsys.security.controller; importjava.io.IOException; importjava.net.DatagramPacket; importjava.net.DatagramSocket; importjava.net.InetAddress; /** *主机A向主机B发送“UDP-NetBIOS-NS”询问包,即向主机B的137端口,发Query包来询问主机B的NetBIOSNames信息。 *其次,主机B接收到“UDP-NetBIOS-NS”询问包,假设主机B正确安装了NetBIOS服务...........而且137端口开放,则主机B会向主机A发送一个“UDP-NetBIOS-NS”应答包,即发Answer包给主机A。 *并利用UDP(NetBIOSNameService)来快速获取远程主机MAC地址的方法 * */ publicclassUdpGetClientMacAddr{ privateStringsRemoteAddr; privateintiRemotePort=137; privatebyte[]buffer=newbyte[1024]; privateDatagramSocketds=null; publicUdpGetClientMacAddr(StringstrAddr)throwsException{ sRemoteAddr=strAddr; ds=newDatagramSocket(); } publicfinalDatagramPacketsend(finalbyte[]bytes)throwsIOException{ DatagramPacketdp=newDatagramPacket(bytes,bytes.length,InetAddress.getByName(sRemoteAddr),iRemotePort); ds.send(dp); returndp; } publicfinalDatagramPacketreceive()throwsException{ DatagramPacketdp=newDatagramPacket(buffer,buffer.length); ds.receive(dp); returndp; } publicbyte[]GetQueryCmd()throwsException{ byte[]t_ns=newbyte[50]; t_ns[0]=0x00; t_ns[1]=0x00; t_ns[2]=0x00; t_ns[3]=0x10; t_ns[4]=0x00; t_ns[5]=0x01; t_ns[6]=0x00; t_ns[7]=0x00; t_ns[8]=0x00; t_ns[9]=0x00; t_ns[10]=0x00; t_ns[11]=0x00; t_ns[12]=0x20; t_ns[13]=0x43; t_ns[14]=0x4B; for(inti=15;i<45;i++){ t_ns[i]=0x41; } t_ns[45]=0x00; t_ns[46]=0x00; t_ns[47]=0x21; t_ns[48]=0x00; t_ns[49]=0x01; returnt_ns; } publicfinalStringGetMacAddr(byte[]brevdata)throwsException{ //获取计算机名 inti=brevdata[56]*18+56; StringsAddr=""; StringBuffersb=newStringBuffer(17); //先从第56字节位置,读出NumberOfNames(NetBIOS名字的个数,其中每个NetBIOSNamesInfo部分占18个字节) //然后可计算出“UnitID”字段的位置=56+NumberOfNames×18,最后从该位置起连续读取6个字节,就是目的主机的MAC地址。 for(intj=1;j<7;j++) { sAddr=Integer.toHexString(0xFF&brevdata[i+j]); if(sAddr.length()<2) { sb.append(0); } sb.append(sAddr.toUpperCase()); if(j<6)sb.append(':'); } returnsb.toString(); } publicfinalvoidclose()throwsException{ ds.close(); } publicfinalStringGetRemoteMacAddr()throwsException{ byte[]bqcmd=GetQueryCmd(); send(bqcmd); DatagramPacketdp=receive(); Stringsmac=GetMacAddr(dp.getData()); close(); returnsmac; } publicstaticvoidmain(Stringargs[])throwsException{ UdpGetClientMacAddrumac=newUdpGetClientMacAddr("172.19.1.198"); umac=newUdpGetClientMacAddr("192.168.16.83"); System.out.println(umac.GetRemoteMacAddr()); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。