Получение MAC-адреса на веб-странице с помощью Java-апплета - PullRequest
1 голос
/ 17 декабря 2010

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

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

  }

Ответы [ 5 ]

5 голосов
/ 19 июня 2012

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

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

2 голосов
/ 09 января 2013

В Netbeans вы можете подписать приложение, включающее WebStart:

  1. Доступ к вашему проекту> свойства> Приложение> WebStart
  2. Установите флажок «Включить веб-запуск».Это показывает секту под названием подпись.
  3. Нажмите кнопку «Настроить», расположенную в разделе подписи.
  4. Выберите «самоподписаться сгенерированным ключом».
1 голос
/ 17 декабря 2010

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

1 голос
/ 17 декабря 2010

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

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

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

0 голосов
/ 17 декабря 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...