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());
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。