Obtenir l'adresse MAC sur une page Web à l'aide d'une applet Java

Je veux créer une application où un serveur Web peut obtenir l'adresse MAC des clients qui se connectent. La seule façon possible dont je pensais était de créer une applet JAVA qui contient des méthodes java.net pour trouver l'adresse mac

J'utilise javascript pour appeler les méthodes de l'applet, mais le navigateur ne permet pas d'exécuter ces méthodes. Voici l'applet que j'ai créée.

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

    Les applets ne peuvent normalement pas accéder à ces fonctions pour des raisons de sécurité. Pour éviter ces restrictions, vous avez besoin d'une applet signée , ainsi que d'un fichier de politique.

    Vous pouvez ensuite écrire un fichier de politique qui accorde à votre applet l'accès aux fonctionnalités dont il a besoin. Si l'utilisateur accorde à votre applet les autorisations nécessaires (il les demandera), votre applet peut utiliser les fonctions.

    Dans Netbeans, vous pouvez signer une application permettant la démarche Web:

    1. Accès à votre projet> propriétés> Application> WebStart
    2. Cochez "Activer le démarrage Web". Ce spectacle a été intitulé signature.
    3. Cliquez sur le bouton "Personnaliser" situé dans la section de signature.
    4. Sélectionnez "auto-signer par clé générée".

    Je ne pense pas que cela sera possible. Les serveurs Web communiquent avec les clients plusieurs couches au-dessus de la couche de lien où les adresses MAC sont en direct – il est supprimé par TCP / IP et il n'y a aucune raison pour le client de l'envoyer à moins que vous ayez spécifiquement le code client pour le faire.

    La raison pour laquelle votre code Java ne fonctionne pas est parce que le gestionnaire de sécurité du sandbox Java interdit ces appels de bas niveau – ce qu'il devrait! Si jamais vous trouvez un moyen d'obtenir que cette chose fonctionne (ce que je doute que vous le feriez), vous devriez le signaler rapidement à Oracle, car cela ne devrait pas se produire du tout.

    Je ne peux pas voir une raison pour laquelle vous le souhaitez non plus, pour être honnête.

    L'applet Java est empêché d'accéder à ces méthodes sur le client car il s'exécute dans un bac à sable protégé.

    Il pourrait ne pas être possible dans un navigateur, car il est contre le paradigme du sandboxing. Vous pouvez avoir de la chance avec des extensions de code natif spécifiques au navigateur.

    Cependant, l'exception importante est que si votre serveur Web est dans le même réseau local (même commutateur) que le client, l'adresse MAC du client est connue du serveur car il est toujours présent dans le paquet IP.