2010-12-17 2 views
0

Я хочу создать приложение, в котором веб-сервер может получить MAC-адрес клиентов, входящих в систему. Единственный возможный способ, который я мог придумать, - создать JAVA-апплет, который содержит методы java.net для поиска адреса macПолучение MAC-адреса на веб-странице с помощью апплета Java

Я использую 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; 
} 

    } 
+3

Зачем вам это нужно? Я могу думать только о вторжении в частную жизнь. – thejh

+0

Вы получаете сообщение об ошибке или знаете, что браузер не разрешает это делать? – Enrique

ответ

1

Я не думаю, что это будет возможно. Веб-серверы обмениваются данными с клиентами на несколько уровней выше уровня канала, в котором живут MAC-адреса - он абстрагируется от TCP/IP, и нет никакой причины для его отправки клиентом, если вы специально не используете для этого клиентский код.

Причина, по которой ваш код Java не работает, заключается в том, что диспетчер безопасности изолированной программной среды Java не разрешает такие вызовы низкого уровня - что и должно быть! Если вы когда-нибудь найдете способ заставить эту работу работать (что я сомневаюсь, что вы это сделаете), вы должны немедленно сообщить об этом Oracle, потому что этого не должно происходить вообще.

Я не вижу большой причины, почему вы бы хотите это либо, честно говоря.

1

Апплет Java не доступен для доступа к этим методам на клиенте, поскольку он работает в защищенной изолированной программной среде.

0

Возможно, это будет невозможно в браузере, так как это противоречит парадигме песочницы. Возможно, вам повезло с расширением собственного кода, зависящим от браузера.

Однако важным исключением является то, что ваш веб-сервер находится в одной и той же локальной сети (такой же коммутатор), что и клиент, - тогда MAC-адрес клиента известен серверу, поскольку он все еще присутствует в IP-адресе пакет.

4

Апплеты обычно не могут обращаться к этим функциям по соображениям безопасности. Чтобы избежать этих ограничений, вам понадобится signed applet, а также файл политики.

Затем вы можете написать файл политики, который предоставляет доступ апплета к требуемым функциям. Если пользователь затем предоставит вашему аплету необходимые разрешения (он будет запрашивать их), ваш апплет может использовать эти функции.

2

В Netbeans, вы можете подписать заявление, позволяющую Webstart:

  1. Доступ к вашему проекту> Свойства> Приложение> Webstart
  2. Check "Включить Web Start". Это показывает сектант под названием подписание.
  3. Нажмите кнопку «Настроить», расположенную в разделе подписи.
  4. Выберите «self-sign by generated key».
Смежные вопросы