Java获取客户端IP地址和MAC地址的实例分享

本篇文章主要介绍了JAVA如何获取客户端IP地址和MAC地址非常具有实用价值,这里整理了详细的代码,需要的朋友可以参考下

本文介绍了JAVA如何获取客户端IP地址和MAC地址 ,分享给大家,具体如下:

1.获取客户端IP地址

public String getIp(HttpServletRequest request) throws Exception {  String ip = request.getHeader("X-Forwarded-For");  if (ip != null) {    if (!ip.isEmpty() && !"unKnown".equalsIgnoreCase(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) {    if (!ip.isEmpty() && !"unKnown".equalsIgnoreCase(ip)) {      return ip;    }  }  return request.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的问题

public String getIp(HttpServletRequest request) throws Exception {  String ip = request.getHeader("X-Forwarded-For");  if (ip != null) {    if (!ip.isEmpty() && !"unKnown".equalsIgnoreCase(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) {    if (!ip.isEmpty() && !"unKnown".equalsIgnoreCase(ip)) {      return ip;    }  }  ip = request.getHeader("Proxy-Client-IP");  if (ip != null) {    if (!ip.isEmpty() && !"unKnown".equalsIgnoreCase(ip)) {      return ip;    }  }  ip = request.getHeader("WL-Proxy-Client-IP");  if (ip != null) {    if (!ip.isEmpty() && !"unKnown".equalsIgnoreCase(ip)) {      return ip;    }  }  ip = request.getRemoteAddr();  return ip.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ip;}

2.获取客户端MAC地址

UdpGetClientMacAddr umac = new UdpGetClientMacAddr(sip);String smac = umac.GetRemoteMacAddr();

添加一个获取MAC的时间限制

final UdpGetClientMacAddr umac = new UdpGetClientMacAddr(sip);//---长时间获取不到MAC地址则放弃ExecutorService exec = Executors.newFixedThreadPool(1);Callable<String> call = new Callable<String>() {  public String call() throws Exception {    return umac.GetRemoteMacAddr();  }};try {  Future<String> future = exec.submit(call);  String smac = future.get(1000 * 1, TimeUnit.MILLISECONDS);  loginMonitor.setMacAddress(smac);} catch (TimeoutException ex) {  loginMonitor.setMacAddress("获取失败");  logger.info("获取MAC地址超时");  ex.printStackTrace();}// 关闭线程池 exec.shutdown();//---

需要先获取IP地址作为参数构造一个UdpGetClientMacAddr

UdpGetClientMacAddr.java

package shmc.commonsys.security.controller;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress; /**  * 主机A向主机B发送“UDP-NetBIOS-NS”询问包,即向主机B的137端口,发Query包来询问主机B的NetBIOS Names信息。  * 其次,主机B接收到“UDP-NetBIOS-NS”询问包,假设主机B正确安装了NetBIOS服务........... 而且137端口开放,则主机B会向主机A发送一个“UDP-NetBIOS-NS”应答包,即发Answer包给主机A。  * 并利用UDP(NetBIOS Name Service)来快速获取远程主机MAC地址的方法  *  */ public class UdpGetClientMacAddr {   private String sRemoteAddr;   private int iRemotePort=137;   private byte[] buffer = new byte[1024];   private DatagramSocket ds=null;    public UdpGetClientMacAddr(String strAddr) throws Exception{     sRemoteAddr = strAddr;     ds = new DatagramSocket();   }    public final DatagramPacket send(final byte[] bytes) throws IOException {     DatagramPacket dp = new DatagramPacket(bytes,bytes.length,InetAddress.getByName(sRemoteAddr),iRemotePort);     ds.send(dp);     return dp;   }    public final DatagramPacket receive() throws Exception {     DatagramPacket dp = new DatagramPacket(buffer,buffer.length);     ds.receive(dp);     return dp;   }   public byte[] GetQueryCmd() throws Exception {     byte[] t_ns = new byte[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(int i = 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;     return t_ns;   }   public final String GetMacAddr(byte[] brevdata) throws Exception {     // 获取计算机名     int i = brevdata[56] * 18 + 56;     String sAddr="";     StringBuffer sb = new StringBuffer(17);     // 先从第56字节位置,读出Number Of Names(NetBIOS名字的个数,其中每个NetBIOS Names Info部分占18个字节)     // 然后可计算出“Unit ID”字段的位置=56+Number Of Names×18,最后从该位置起连续读取6个字节,就是目的主机的MAC地址。     for(int j = 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(':');     }     return sb.toString();   }    public final void close() throws Exception {     ds.close();   }    public final String GetRemoteMacAddr() throws Exception {     byte[] bqcmd = GetQueryCmd();     send(bqcmd);     DatagramPacket dp = receive();     String smac = GetMacAddr(dp.getData());     close();      return smac;   }      public static void main(String args[]) throws Exception{     UdpGetClientMacAddr umac=new UdpGetClientMacAddr("172.19.1.198");     umac=new UdpGetClientMacAddr("192.168.16.83");     System.out.println(umac.GetRemoteMacAddr());   } }

以上就是Java获取客户端IP地址和MAC地址的实例分享的详细内容,更多请关注其它相关文章!

年轻是我们唯一拥有权利去编织梦想的时光

Java获取客户端IP地址和MAC地址的实例分享

相关文章:

你感兴趣的文章:

标签云: