Как запустить апплет с разрешениями политики в Java для чтения MAC-адреса - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь разработать апплет в NetBeans, который может читать MAC-адрес.

Так вот моя структура каталогов

enter image description here

Вот мой ОБНОВЛЕННЫЙ код

MacAddrApplet.java

import java.awt.Graphics;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.Enumeration;
import javax.swing.JApplet;

/**
 *
 * @author jay.patel
 */
public class MacAddressApplet extends JApplet {

    public static String getMacFromInterface(NetworkInterface ni) throws SocketException {
        byte mac[] = ni.getHardwareAddress();

        if (mac != null) {
            StringBuilder macAddress = new StringBuilder("");
            String sep = "";
            for (byte o : mac) {
                macAddress.append(sep).append(String.format("%02X", o));
                sep = ":";
            }
            return macAddress.toString();
        }

        return "";
    }

    public static String[] getInterfaces() {
        try {
            Enumeration<NetworkInterface> nis = NetworkInterface.getNetworkInterfaces();

            ArrayList<String> result = new ArrayList<String>();
            while (nis.hasMoreElements()) {
                NetworkInterface ni = nis.nextElement();
                if (ni.isUp() && !ni.isLoopback() && !ni.isVirtual()) {
                    String mac = getMacFromInterface(ni);
                    String str = ni.getDisplayName() + ";" + mac;
                    result.add(str);
                }
            }
            return result.toArray(new String[0]);
        } catch (SocketException e) {
            System.out.println("SocketException:: " + e.getMessage());
        } catch (Exception e) {
            System.out.println("Exception:: " + e.getMessage());
        }

        return new String[0];
    }

    public static String getInterfacesJSON() {
        try {
            String macs[] = getInterfaces();

            String sep = "";
            StringBuilder macArray = new StringBuilder("['");
            for (String mac : macs) {
                macArray.append(sep).append(mac);
                sep = "','";
            }
            macArray.append("']");

            return macArray.toString();
        } catch (Exception e) {
            System.out.println("Exception:: " + e.getMessage());
        }

        return "[]";
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
         AccessController.doPrivileged(new PrivilegedAction() {
            public Object run() {
                String macs[] = getInterfaces();

                for (String mac : macs) {
                    System.out.println(" Interfaces = " + mac);
                }

                System.out.println(" Interfaces JSON = " + getInterfacesJSON());
                g.drawString("MAC: " + getInterfacesJSON(), 100, 100);
                return null;
            }
        });

    }

}

MacAddrApplet.html

<HTML>
<HEAD>
    <TITLE>Applet HTML Page</TITLE>
</HEAD>
<BODY>

    <H3><HR WIDTH="100%">Applet HTML Page<HR WIDTH="100%"></H3>

    <P><APPLET codebase="classes" code="MacAddrApplet.class" width=350 height=200></APPLET></P>

    <HR WIDTH="100%"><FONT SIZE=-1><I>Generated by NetBeans IDE</I></FONT>
</BODY>

applet.policy

grant {
permission java.security.AllPermission;
};

Когда я пытаюсь запустить мой апплет из Run -> Run File, он отлично работает и показывает мой Mac-адрес в нем, с этим журналом, который я печатаю

Interfaces = en1;XX:XX:XX:XX:XX:XX
Interfaces JSON = ['en1;XX:XX:XX:XX:XX:XX']

Но когда я пытаюсь запустить его, используя

appletviewer build/MacAddrApplet.html

печатает

Interfaces = en1;
Interfaces JSON = ['en1;']

Как я могу решить эту проблему ??

P.S. Я думаю, что это происходит, потому что он не использует разрешения applet.policy

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

В конце концов я понял, что не так с командой терминала

appletviewer build/MacAddrApplet.html

потому что, если вы видите файл project.properties, расположенный в папке nbproject, в конце вы увидите

run.jvmargs=-Djava.security.policy=applet.policy

Поэтому, когда я запускаю апплет с помощью Run -> Run File Netbeans внутренне позаботился обо всем, и, следовательно, апплет работает отлично.

Но , в случае терминала, мне нужно явно указать policy file (это то, что я хочу знать, когда я задал вопрос!), Поэтому запустите апплет с этой командой и это будет работать нормально ...

appletviewer -J-Djava.security.policy=applet.policy build/MacAddrApplet.html
0 голосов
/ 31 октября 2018

Это не обязательно проблема с разрешениями апплета. Это в первую очередь старая добрая ошибка в вашем коде: -).

Считайте документы для NetworkInterface.getHardwareAddress() - метод может вернуть null:

возвращает: байтовый массив, содержащий адрес, или ноль, если адрес не существует, недоступен или установлен менеджер безопасности и абонент не имеет разрешения NetPermission ( "getNetworkInformation")

Вы забыли нулевую проверку при вызове, таким образом, исключение NullPointerException.

Что касается почему вы получаете обратно null - это может быть из-за SecurityManager (как показывают документы), но в этом случае проблема, вероятно, в том, что InetAddress.getLocalHost() дал вам localhost address, и, следовательно, интерфейс, который вы получили, является интерфейсом обратной связи Интерфейс обратной связи, являющийся имитируемым интерфейсом, не имеет MAC-адреса, поэтому NetworkInterface.getHardwareAddress() вернет null.


Делая шаг назад, ваша первая ошибка - использовать InetAddress.getLocalHost(). Компьютер может иметь несколько сетевых интерфейсов с несколькими IP-адресами (например, проводной интерфейс Ethernet и интерфейс WLAN, а также виртуальные интерфейсы, такие как шлейф или для VPN-клиента). Таким образом, в общем случае существует не «MAC-адрес», а 0-n MAC-адресов, в зависимости от конфигурации системы.

Вам необходимо выяснить, как вы выбираете свой MAC-адрес среди доступных. Вы можете использовать NetworkInterface.getNetworkInterfaces() для извлечения всех интерфейсов, которые есть в системе (даже деактивированных), а затем пройти через них, чтобы решить, какой из них вам нравится (а какой имеет MAC-адрес).

...