使用Java小程序在网页上获取MAC地址

时间:2010-12-17 05:18:30

标签: javascript applet

我想创建一个应用程序,其中Web服务器可以获取登录客户端的MAC地址。我能想到的唯一可能的方法是创建一个包含java.net方法的JAVA applet来查找mac地址< / p>

我使用javascript调用applet方法,但浏览器不允许执行这些方法。下面是我创建的小程序。

import java.applet.*;
import java.awt.*;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;

public class AppletRunner extends Applet{
 // The method that will be automatically called  when the applet is started
    public void init()
    {
// It is required but does not need anything.
    }


//This method gets called when the applet is terminated
//That's when the user goes to another page or exits the browser.
    public void stop()
    {
    // no actions needed here now.
    }


//The standard method that you have to use to paint things on screen
//This overrides the empty Applet method, you can't called it "display" for example.

    public void paint(Graphics g)
    {
//method to draw text on screen
// String first, then x and y coordinate.
     g.drawString(getMacAddr(),20,20);
     g.drawString("Hello World",20,40);

    } 
  public String getMacAddr() {
   String macAddr= ""; 
    InetAddress addr;
 try {
  addr = InetAddress.getLocalHost();

        System.out.println(addr.getHostAddress());
        NetworkInterface dir = NetworkInterface.getByInetAddress(addr);
        byte[] dirMac = dir.getHardwareAddress();

        int count=0;
        for (int b:dirMac){
         if (b<0) b=256+b;
         if (b==0) {
               macAddr=macAddr.concat("00"); 
         }
         if (b>0){

          int a=b/16;
          if (a==10) macAddr=macAddr.concat("A");
          else if (a==11) macAddr=macAddr.concat("B");
          else if (a==12) macAddr=macAddr.concat("C");
          else if (a==13) macAddr=macAddr.concat("D");
          else if (a==14) macAddr=macAddr.concat("E");
          else if (a==15) macAddr=macAddr.concat("F");
          else macAddr=macAddr.concat(String.valueOf(a));
             a = (b%16);
          if (a==10) macAddr=macAddr.concat("A");
          else if (a==11) macAddr=macAddr.concat("B");
          else if (a==12) macAddr=macAddr.concat("C");
          else if (a==13) macAddr=macAddr.concat("D");
          else if (a==14) macAddr=macAddr.concat("E");
          else if (a==15) macAddr=macAddr.concat("F");
          else macAddr=macAddr.concat(String.valueOf(a));
         }
         if (count<dirMac.length-1)macAddr=macAddr.concat("-");
         count++;
        }

 } catch (UnknownHostException e) {
  // TODO Auto-generated catch block
  macAddr=e.getMessage();
 } catch (SocketException e) {
  // TODO Auto-generated catch block
  macAddr = e.getMessage();
 }
 return macAddr;
 }

  }

5 个答案:

答案 0 :(得分:5)

出于安全原因,Applet无法正常访问这些功能。要避免这些限制,您需要signed applet以及策略文件。

然后,您可以编写一个策略文件,授予您的applet访问所需功能的权限。如果用户然后授予您的applet必要的权限(它将提示他们),您的applet可以使用这些功能。

答案 1 :(得分:2)

在Netbeans中,您可以签署启用WebStart的应用程序:

  1. 访问您的项目&gt;属性&gt;申请&gt; Webstart的
  2. 选中“启用Web Start”。这显示了一个名为签名的sectin。
  3. 点击签名部分中的“自定义”按钮。
  4. 选择“按生成密钥自签名”。

答案 2 :(得分:1)

我不认为这是可能的。 Web服务器与链接层上方的几个层进行通信,其中MAC地址是实时的 - 它被TCP / IP抽象出来,除非您专门有客户端代码,否则客户端没有理由发送它。

Java代码无法正常工作的原因是因为Java沙箱的安全管理器不允许这样的低级调用 - 它应该是这样!如果你确实找到了让这个东西工作的方法(我怀疑你会这样做),你应该立即向Oracle报告,因为它根本不应该发生。

说实话,我也看不出你为什么想要它的原因。

答案 3 :(得分:1)

禁止Java applet访问客户端上的这些方法,因为它在受保护的沙箱中运行。

答案 4 :(得分:0)

在浏览器中可能无法实现,因为它违反了沙盒范例。您可能会对浏览器特定的本机代码扩展感到满意。

但是,重要的例外是如果您的Web服务器与客户端位于同一局域网(相同的交换机)中 - 那么,客户端的MAC地址对于服务器是已知的,因为它仍然存在于IP数据包中。