2013-02-12 14 views
5

Sto cercando una soluzione per un'applicazione web basata su Java per identificare in modo univoco il client. Il server si trova nella stessa rete dei client e ho pensato che utilizzare l'indirizzo MAC sarebbe stata una buona soluzione. Il problema è che non posso lavorare con i cookie perché possono essere cancellati dal lato client e non posso usare l'IP perché potrebbero semplicemente emettere un nuovo rinnovo del lease DHCP.Come ottenere uuid o indirizzo mac dal client in Java?

Quindi mi piacerebbe ricadere sull'indirizzo MAC dei client. Sono consapevole del fatto che non ci sono funzioni java integrate per ottenere l'indirizzo MAC. Esiste una libreria in grado di gestire l'output di ogni sistema operativo? (Windows primario e Mac) poiché la mia applicazione java viene eseguita su entrambe le piattaforme.

o ci sono altri suggerimenti per l'identificazione univoca di un client all'interno di un sito Web e del protocollo HTTP? (forse archivi di dati HTML5 o qualcos'altro)

Sto usando Java 1.7 btw.

Non forzerò l'utente ad accedere o comunque a identificarsi e non programmerò un'app nativa per lo smartphone dei clienti.

+0

ecco la risposta: "Come ottenere un identificatore unico computer in Java (come id disco o id scheda madre)" (http:// StackOverflow.it/questions/1986732/how-to-get-a-unique-computer-identifier-in-java-like-disk-id-or-motherboard-id) –

+0

Sto cercando un uuid di un CLIENT che è solo usando il webservice. (Nessuna applet Java sul client coinvolto), il tuo collegamento riguarda solo il computer locale. – Nexus2k

risposta

10

Ho scritto il mio metodo per risolvere il mio problema. Qui è se mai qualcuno ha bisogno di codice per trovare un indirizzo MAC nella stessa rete. Lavora per me, senza privilegi di amministratore su Win 7 e Mac OS X 10.8.2

Pattern macpt = null; 

private String getMac(String ip) { 

    // Find OS and set command according to OS 
    String OS = System.getProperty("os.name").toLowerCase(); 

    String[] cmd; 
    if (OS.contains("win")) { 
     // Windows 
     macpt = Pattern 
       .compile("[0-9a-f]+-[0-9a-f]+-[0-9a-f]+-[0-9a-f]+-[0-9a-f]+-[0-9a-f]+"); 
     String[] a = { "arp", "-a", ip }; 
     cmd = a; 
    } else { 
     // Mac OS X, Linux 
     macpt = Pattern 
       .compile("[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+"); 
     String[] a = { "arp", ip }; 
     cmd = a; 
    } 

    try { 
     // Run command 
     Process p = Runtime.getRuntime().exec(cmd); 
     p.waitFor(); 
     // read output with BufferedReader 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       p.getInputStream())); 
     String line = reader.readLine(); 

     // Loop trough lines 
     while (line != null) { 
      Matcher m = macpt.matcher(line); 

      // when Matcher finds a Line then return it as result 
      if (m.find()) { 
       System.out.println("Found"); 
       System.out.println("MAC: " + m.group(0)); 
       return m.group(0); 
      } 

      line = reader.readLine(); 
     } 

    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 

    // Return empty string if no MAC is found 
    return ""; 
} 
+0

Questo non è garantito a causa di questo "Per poter ARP un dispositivo, è necessario disporre di un'interfaccia (SVI) su tale switch su quella rete.Per ARP un dispositivo è necessario disporre di un'interfaccia con un IP di livello 3 sullo stesso livello 2 vlan. " un'alternativa è usare "getmac/s 00.00.00.00" dove 00.00.00.00 è l'indirizzo IP remoto – RageAgainstTheMachine

+0

@ Nexus2K ho usato il tuo codice funziona correttamente per il sistema Windows ma Linux non funziona perché – KVK

+0

@KVK funziona sotto linux menta. Se stai richiedendo da '127.0.0.1', non troverà nulla. Implementalo! – selan

3

Il migliore che ho trovato è questo: Query ARP cache to get MAC ID

e la sintesi vaso è che:

  • non v'è alcuna API standard di Java,
  • non c'è nessun sistema operativo soluzione indipendente,
  • in genere l'applicazione deve essere privilegiata (ad es. Accesso root) per interrogare la cache ARP dell'host e
  • se i pacchetti passano attraverso un router di rete, y ou non sarà più in grado di identificare l'indirizzo MAC di origine.

Non penso che questo sia un buon approccio per identificare la macchina dell'utente.

Si consideri, inoltre, che:

  • Questo identifica solo la macchina, non l'utente. Alcuni computer sono condivisi da più utenti.
  • Anche gli indirizzi MAC possono essere modificati.
+0

Ulteriori informazioni sui clienti. Sono tutti smartphone che non sono condivisi su più utenti. La modifica dell'indirizzo MAC degli smartphone è esponenzialmente più difficile dell'eliminazione dei cookie. – Nexus2k

+0

E come indicato nella domanda tutti i clienti si trovano nella stessa rete – Nexus2k

+0

stessa risposta temo. –

0

L'utilizzo di indirizzi IP non funziona nella rete locale. Ho usato qualche altro metodo per ottenere un indirizzo MAC - sysout parsing di comandi utili.

public String getMacAddress() throws Exception { 
    String macAddress = null; 
    String command = "ifconfig"; 

    String osName = System.getProperty("os.name"); 
    System.out.println("Operating System is " + osName); 

    if (osName.startsWith("Windows")) { 
     command = "ipconfig /all"; 
    } else if (osName.startsWith("Linux") || osName.startsWith("Mac") || osName.startsWith("HP-UX") 
      || osName.startsWith("NeXTStep") || osName.startsWith("Solaris") || osName.startsWith("SunOS") 
      || osName.startsWith("FreeBSD") || osName.startsWith("NetBSD")) { 
     command = "ifconfig -a"; 
    } else if (osName.startsWith("OpenBSD")) { 
     command = "netstat -in"; 
    } else if (osName.startsWith("IRIX") || osName.startsWith("AIX") || osName.startsWith("Tru64")) { 
     command = "netstat -ia"; 
    } else if (osName.startsWith("Caldera") || osName.startsWith("UnixWare") || osName.startsWith("OpenUNIX")) { 
     command = "ndstat"; 
    } else {// Note: Unsupported system. 
     throw new Exception("The current operating system '" + osName + "' is not supported."); 
    } 

    Process pid = Runtime.getRuntime().exec(command); 
    BufferedReader in = new BufferedReader(new InputStreamReader(pid.getInputStream())); 
    Pattern p = Pattern.compile("([\\w]{1,2}(-|:)){5}[\\w]{1,2}"); 
    while (true) { 
     String line = in.readLine(); 
     System.out.println("line " + line); 
     if (line == null) 
      break; 

     Matcher m = p.matcher(line); 
     if (m.find()) { 
      macAddress = m.group(); 
      break; 
     } 
    } 
    in.close(); 
    return macAddress; 
} 

Questo dovrebbe funzionare ovunque. Almeno, l'utilizzo di questo metodo su una macchina Ubuntu dà il seguente risultato:

Operating System is Linux 
line eth0  Link encap:Ethernet HWaddr f4:6d:04:63:8e:21 
mac: f4:6d:04:63:8e:21 
+1

Rileggi la mia domanda, ho bisogno del MAC dei computer remoti ... non mio. – Nexus2k

Problemi correlati