`
啸笑天
  • 浏览: 3465780 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

Java/JSP获得客户端网卡MAC地址的三种方法解析(附:获得真实IP)

    博客分类:
  • java
阅读更多

Java/JSP获得客户端网卡MAC地址的三种方法解析

从网上查找资料java/jsp获得客户端(IE)网卡MAC地址的方法大概有三种。

1、通过命令方式,在客户端执行Ipconfig 等等。(java/jsp)

2、通过ActiveX的方法。(jsp)

3、通过向137的端口发送查询指令的方法。(java/jsp)

 

简介:

第一种方法,在真正用到时候不知道为什么获得mac地址的指令阻塞了,不往下继续执行。而且速度是这三种方法中最慢的一种。

代码如下:

String sip="";
String smac="";
sip = request.getHeader("x-forwarded-for");
if(sip == null ||sip.length() == 0 || "unknown".equalsIgnoreCase(sip))
{
sip = request.getHeader("proxy-Client-IP");
}
if (sip == null || sip.length() == 0 || "unknown".equalsIgnoreCase(sip)) 
{
    sip = request.getHeader("WL-Proxy-Client-IP");

if (sip == null ||sip.length() == 0 || "unknown".equalsIgnoreCase(sip)) 
{
    sip = request.getRemoteAddr();
}

    if(!"127.0.0.1".equals(sip)) //本机过滤掉
   {
       Process process = Runtime.getRuntime().exec("nbtstat -a " + sip);
       InputStreamReader ir = new InputStreamReader(process.getInputStream());
    LineNumberReader input = new LineNumberReader(ir);
    String line;
while ((line = input.readLine()) != null)
      if (line.indexOf("MAC Address") > 0) 
   {
          smac = line.substring(line.indexOf("-") - 2);
   }

 

第二种方法是用ActiveX来获得,速度比第一种方法快但是必须降低安全设置否则脚本不被执行

IE设置如下

1.打开IE浏览器
2.工具->Internet选项->安全
3.自定义级别(C)...
4.设置中对未标记为可安全执行脚本的ActiveX控件初始化并执行脚本
   选中启动(不安全)->每次不用点击"是"按钮,推荐,当然你的机器不能上互联网否则会有安全问题。
   选中提示->每次都得点击"是"按钮。
5.点击"确定"->"确定"按钮
6.重新启动IE浏览器设置生效

 

代码

<SCRIPT language=JScript event="OnCompleted(hResult,pErrorObject, pAsyncContext)" for=foo>
document.forms[0].userMacAddr.value=unescape(MACAddr);
</SCRIPT>
<SCRIPT language=JScript event=OnObjectReady(objObject,objAsyncContext) for=foo>
   if(objObject.IPEnabled != null && objObject.IPEnabled != "undefined" && objObject.IPEnabled == true)
   {
    if(objObject.MACAddress != null && objObject.MACAddress != "undefined")
    MACAddr = objObject.MACAddress;
    }
</SCRIPT>
<META content="MSHTML 6.00.2800.1106" name=GENERATOR>
...

<body>
<OBJECT id=locator classid=CLSID:76A64158-CB41-11D1-8B02-00600806D9B6 VIEWASTEXT></OBJECT>
<OBJECT id=foo classid=CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223></OBJECT>
<SCRIPT language=JScript>
   var service = locator.ConnectServer();
   var MACAddr ;
   service.Security_.ImpersonationLevel=3;
   service.InstancesOfAsync(foo, 'Win32_NetworkAdapterConfiguration');
</SCRIPT>
...        <td height="20" align="center">标 识:</td>
<td><input value="no" name="userMacAddr" size="20" style="width:150px" readonly="yes"></td>

 

第三种方法是用UDP协议来发送查询mac指令然后返回值中解析mac。个人认为这是最好的方法(暂时)速度最快

 

<%
String smac = "";
String sip = request.getHeader("x-forwarded-for");   
if(sip == null || sip.length() == 0 || "unknown".equalsIgnoreCase(sip)) {   
    sip = request.getHeader("Proxy-Client-IP");   
}   
if(sip == null || sip.length() == 0 || "unknown".equalsIgnoreCase(sip)) {   
    sip = request.getHeader("WL-Proxy-Client-IP");   
}   
if(sip == null || sip.length() == 0 || "unknown".equalsIgnoreCase(sip)) {   
    sip = request.getRemoteAddr();   
}   
UdpGetClientMacAddr umac = new UdpGetClientMacAddr(sip);
smac = umac.GetRemoteMacAddr();
%>

...

<input value=<%=smac %> name="userMacAddr" size="20" style="width:150px" readonly="yes">

 

 UdpGetClientMacAddr.java

package zyj;
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地址的方法
 * 
 * @author WINDY
 */

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();
    }
    
    protected final DatagramPacket send(final byte[] bytes) throws IOException {
     DatagramPacket dp = new DatagramPacket(bytes,bytes.length,InetAddress.getByName(sRemoteAddr),iRemotePort);
     ds.send(dp);
        return dp;
    }
    
    protected final DatagramPacket receive() throws Exception {
     DatagramPacket dp = new DatagramPacket(buffer,buffer.length);
     ds.receive(dp);
     return dp;
    }
     // 询问包结构:
    // Transaction ID 两字节(16位) 0x00 0x00
    // Flags 两字节(16位) 0x00 0x10
    // Questions 两字节(16位) 0x00 0x01
    // AnswerRRs 两字节(16位) 0x00 0x00
    // AuthorityRRs 两字节(16位) 0x00 0x00
    // AdditionalRRs 两字节(16位) 0x00 0x00
    // Name:array [1..34] 0x20 0x43 0x4B 0x41(30个) 0x00 ;
    // Type:NBSTAT 两字节 0x00 0x21
    // Class:INET 两字节(16位)0x00 0x01
    protected 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;
    }
     // 表1 “UDP-NetBIOS-NS”应答包的结构及主要字段一览表
    // 序号 字段名 长度
    // 1 Transaction ID 两字节(16位)
    // 2 Flags 两字节(16位)
    // 3 Questions 两字节(16位)
    // 4 AnswerRRs 两字节(16位)
    // 5 AuthorityRRs 两字节(16位)
    // 6 AdditionalRRs 两字节(16位)
    // 7 Name<Workstation/Redirector> 34字节(272位)
    // 8 Type:NBSTAT 两字节(16位)
    // 9 Class:INET 两字节(16位)
    // 10 Time To Live 四字节(32位)
    // 11 Length 两字节(16位)
    // 12 Number of name 一个字节(8位)
    // NetBIOS Name Info 18×Number Of Name字节
    // Unit ID 6字节(48位
    protected 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() {
     try
     {
      ds.close();
     }
     catch (Exception ex){
      ex.printStackTrace();
     }
    }
    
    public final String GetRemoteMacAddr() throws Exception {
     byte[] bqcmd = GetQueryCmd();
     send(bqcmd);
     DatagramPacket dp = receive();
        String smac = GetMacAddr(dp.getData());
        close();
        
        return smac;
    }
}

 

 

 

 

// 获取真实IP的方法().                                jsp

public String getIpAddr(HttpServletRequest request) {
       String ip = 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.getRemoteAddr();
       }
       return ip;
   }

 

//                                              java

补充:
关于获取IP地址的方式,最近在linux下有一个教训,如果单纯通过InetAddress来获取IP地址,就会出现在不同的机器上IP地址不同的问题。
InetAddress.getLocalHost().getAddress() 实际上是根据hostname来获取IP地址的。linux系统在刚刚装完默认的hostname是localhost,所以通过上面代码获取到的本机ip就是127.0.0.1, 相对应,比如我的hostname就是rjlin.atsig.com 返回的ip地址确是atsig.com的地址。暂时采用下面代码来处理,当然还不够灵活:

public static byte[] getIp() throws UnknownHostException {
byte[] b = InetAddress.getLocalHost().getAddress();
Enumeration allNetInterfaces = null;
try {
allNetInterfaces = NetworkInterface.getNetworkInterfaces();
} catch (SocketException e) {
e.printStackTrace();
}
InetAddress ip = null;
NetworkInterface netInterface = null;
while (allNetInterfaces.hasMoreElements()) {
netInterface = (NetworkInterface) allNetInterfaces.nextElement();
if (netInterface.getName().trim().equals("eth0")){
Enumeration addresses = netInterface.getInetAddresses();
while (addresses.hasMoreElements()) {
ip = (InetAddress) addresses.nextElement();
}
break;
}
}
if (ip != null && ip instanceof Inet4Address) {
return b = ip.getAddress();
}
return b;
}

 

 

mac地址是可以通过注册表修改的,不建议以此来作为限制依据~ 

 

 

 

http://justsee.iteye.com/blog/803328

分享到:
评论

相关推荐

    Java/JSP获得客户端网卡MAC地址的三种方法解析

    本文将深入解析在Java/JSP环境中获取客户端网卡MAC地址的三种常见方法,旨在为开发者提供全面而深入的理解。 ### 方法一:通过Java NIO(非阻塞I/O)库 Java NIO库提供了访问底层网络接口的能力,从而可以获取包括...

    java 获取客户端ip mac地址

    ### Java 获取客户端 IP 和 MAC 地址 在Java Web开发中,有时我们需要获取客户端的IP地址甚至是MAC地址,以便进行安全验证、用户行为追踪等操作。本文将详细介绍如何通过Java来实现这一功能。 #### 一、获取客户端...

    Java获取客户端IP及Mac地址(同网段).rar

    Java,运用了多线程内部执行,不影响其他登录验证操作。在Controller类获取客户端的IP地址的方法是:request....所以我们这里添加了条件验证,将客户端IP及Mac地址(同网段)与本地本地IP及Mac地址方法分开。

    JSP获取客户端IP地址浏览器版本操作系统.pdf

    获取客户端IP地址、浏览器版本和操作系统信息在JSP中的实现方法 在JSP中,获取客户端的IP地址、浏览器版本和操作系统信息是非常重要的。通过使用HttpServletRequest对象,我们可以获取到客户端的相关信息。 获取...

    使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core],

    无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core],解决办法:WEB/INF的lib下,除了导入jstl.jar包,还要导入standard.jar包。另外,解压standard.jar包,把.tld文件...

    jsp页面得到客户端的真是ip

    ### JSP 页面获取客户端真实 IP 的方法 在 IT 领域中,了解客户端的真实 IP 地址对于网站统计、安全防护以及个性化推荐等方面都非常重要。由于互联网中的 HTTP 请求经常通过代理服务器转发,因此直接使用 `request....

    无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl

    标题中的问题“无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl”指出,这可能是Java Web应用开发中遇到的一个常见错误,涉及到JSP(JavaServer Pages)和JSTL(Java...

    Java/Jsp 多功能上传下载模块

    Java/JSP多功能上传下载模块是Web开发中常见的一种功能组件,尤其在企业级应用和网站中,用于处理用户上传文件(如图片、文档等)和下载资源的需求。本模块提供了完善的解决方案,支持多文件上传和下载,使得用户...

    jsp获取客户端IP地址的方法.docx

    本文将详细介绍几种在JSP环境中获取客户端IP地址的有效方法,并提供实际的代码示例。 #### 二、获取客户端IP地址的重要性 1. **安全性**:通过识别用户的真实IP地址,可以帮助防止恶意攻击。 2. **统计分析**:收集...

    jsp获取浏览者真实IP地址方法

    ### JSP中获取浏览者真实IP地址的详细解析 在Web开发中,获取客户端的IP地址是一项基础且重要的功能,特别是在需要追踪用户地理位置、限制访问权限或是进行数据分析时。然而,在复杂的网络环境中,如存在代理服务器...

    java获得客户端真实的ip地址

    我们知道在jsp里,获取网页客户端的ip地址的方法是:request.getremoteaddr(),这种方法在大部分情况下都是有效的。但是在通过了apache,squid等反向代理软件就不能获取到客户端的真实ip地址了。如果使用了反向代理...

    Java正确获取客户端真实IP方法整理.docx

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。 如果使用了反向代理软件,将...

    JSP如何获取客户端真实IP地址

    在JSP中,获取客户端IP的方法为:request.getRemoteAddr()。这种方法在大部分情况下都是有效的,但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。 如果使用了反向代理软件,将...

    获取客户端IP

    在很多应用下都可能有需要将用户的真实IP记录下来,这时就要获得用户的真实IP地址,在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等...

    获取客户端网卡MAC地址和IP地址实现JS代码

    要获取服务器端的MAC很容易,但是要获取客户端的MAC的地址确要花费一翻心思,通常的做法是调用Win32API或直接调用nbtstat命令,这样做有很多问题,而另一种方法就是直接用客户端脚本,我们这里用Javascript,这样做...

    JSP获取客户端IP地址-浏览器版本-操作系统[参考].pdf

    "JSP获取客户端IP地址-浏览器版本-操作系统" 在 JSP 中,获取客户端的 IP 地址、浏览器版本和操作系统信息是一项重要的任务。下面我们将详细介绍如何获取这些信息。 获取客户端的 IP 地址 在 JSP 中,获取客户端...

    jsp获取客户端IP地址的方法

    在Java语言开发的Web应用中,尤其是在使用Java Server Pages(JSP)技术时,获取客户端的IP地址是常见的需求之一,这可以用于日志记录、用户访问统计、安全性检查等多种场景。本文详细介绍了几种在JSP中获取客户端IP...

    Oracle+java+jsp BS/CS 管理系统客户端源代码

    标题中的“Oracle+java+jsp BS/CS 管理系统客户端源代码”指的是一个基于Oracle数据库、Java编程语言和JSP(Java Server Pages)技术开发的管理系统的客户端部分的源代码。这样的系统通常用于构建B/S(Browser/...

    获取客户端IP地址所需Jar包

    首先,我们需要了解在Java Web应用中获取客户端IP地址的基本方法。通常,在Servlet环境下,可以通过HttpServletRequest对象的getRemoteAddr()方法来获取。然而,在某些情况下,如通过反向代理服务器(如Nginx、...

    Java根据Request获取客户端IP

    下面是获取客户端真实IP地址的两种方法: 方法一: ```java public String getRemortIP(HttpServletRequest request) { if (request.getHeader("x-forwarded-for") == null) { return request.getRemoteAddr(); ...

Global site tag (gtag.js) - Google Analytics