【问题标题】:Getting MAC address on a web page using a Java applet使用 Java 小程序在网页上获取 MAC 地址
【发布时间】:2010-12-17 05:18:30
【问题描述】:

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

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

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;
 }

  }

【问题讨论】:

  • 你为什么要那个?我只能想到侵犯隐私。
  • 您是否遇到错误或您怎么知道浏览器不允许?

标签: javascript applet


【解决方案1】:

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

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

【讨论】:

  • 我已经签署了我的小程序,下一步怎么办?如何请求授予用户的权限?请帮帮我
  • @JayPatel:您好,请不要在 cmets 中提问。在描述问题的地方提出一个新问题。
【解决方案2】:

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

  1. 访问您的项目 > 属性 > 应用程序 > WebStart
  2. 选中“启用 Web Start”。这显示了一个名为signing 的sectin。
  3. 点击位于签名部分的“自定义”按钮。
  4. 选择“通过生成的密钥自签名”。

【讨论】:

    【解决方案3】:

    我认为这是不可能的。 Web 服务器在 MAC 地址所在的链路层之上的几层与客户端通信——它被 TCP/IP 抽象出来,客户端没有理由发送它,除非您有专门的客户端代码来执行此操作。

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

    老实说,我也看不出你想要它的太多理由。

    【讨论】:

      【解决方案4】:

      Java 小程序无法访问客户端上的这些方法,因为它在受保护的沙箱中运行。

      【讨论】:

        【解决方案5】:

        这在浏览器中可能是不可能的,因为它违反了沙盒范式。您可能会对特定于浏览器的本机代码扩展感到幸运。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-18
          相关资源
          最近更新 更多