2013-02-12 28 views
5

私は、クライアントを一意に識別するためのJavaベースのWebアプリケーションのソリューションを探しています。サーバーはクライアントと同じネットワークにあり、私はMACアドレスを使用すると良い解決策になると思っていました。 問題はクライアントサイドで削除することができ、新しいDHCPリース更新を発行するだけなのでIPを使用できないため、クッキーを使用できないということです。Javaのクライアントからuuidまたはmacアドレスを取得する方法は?

私はクライアントのMACアドレスにフォールバックしたいと思います。私は、MACアドレスを取得するためのJavaの組み込み機能がないことを認識しています。 すべてのOSの出力を処理できるライブラリはありますか? (プライマリWindowsとMac)私のJavaアプリケーションは両方のプラットフォームで動作するので、

またはWebサイトとHTTPプロトコル内のクライアントを一意に識別するための他の提案はありますか? (多分HTML5データストアなど)

私はJava 1.7 btwを使用しています。

私はユーザーにログインを強制することはありません。それ以外の場合は自分の身元を明示し、クライアントスマートフォンのネイティブアプリをプログラムしません。

+0

を答えは:「(ディスクIDまたはマザーボードのIDのような)Javaで一意のコンピュータ識別子を取得する方法」(のhttp:/ /スタックオーバーフロー。com/questions/1986732/how-to-get-a-unique-computer-identifier-in-java-like-disk-id-or-motherboard-id) –

+0

私はCLIENTのuuidを探していますWebサービスを使用します。 (関連するクライアント上にJavaアプレットはありません)、リンクにはローカルコンピュータのみが関与します。 – Nexus2k

答えて

10

私は自分の問題を解決するための方法を書いた。同じネットワーク内でMACアドレスを見つけるために誰かがコードを必要としているのであれば、ここでそれがあります。勝利7と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

これは保証されていません。「デバイスをARPできるようにするには、そのネットワーク上のスイッチにインターフェイス(SVI)が必要です。デバイスにARPを設定するには、レイヤ3 IP 2 VLAN。代わりに "getmac/s 00.00.00.00"を使用します。00.00.00.00はリモートIPアドレスです – RageAgainstTheMachine

+0

@ Nexus2K Windowsシステムで正しく動作するコードを使用しましたが、Linuxで動作しない理由 – KVK

+0

@KVK Linuxで動作しますミント。あなたが '127.0.0.1'からリクエストしている場合は、何も見つかりません。実装する! – selan

3

私は見つけることができる最善のはこれです:Query ARP cache to get MAC ID

そして、鉢植えの要約があることである:オペレーティング・システムに依存しないソリューション、 がない、ない標準のJava APIはありません

  • ホストのARPキャッシュを照会するには、通常アプリケーションに特権(ルートアクセスなど)が必要で、
  • パケットがネットワークルーターを通過する場合はy ouは送信元MACアドレスを識別できなくなります。

私はこれがあなたのユーザーのマシンを識別するための良いアプローチだとは思わない。

は、また考えてみましょう:

  • これは機械ではなく、ユーザを特定します。一部のコンピュータは複数のユーザーによって共有されます。
  • MACアドレスも変更できます。
+0

クライアントに関する詳細。それらは、複数のユーザーで共有されていないすべてのスマートフォンです。スマートフォンのMACアドレスを変更することは、クッキーを削除するよりも指数関数的に困難です。 – Nexus2k

+0

質問に記載されているように、すべてのクライアントが同じネットワークにあります。 – Nexus2k

+0

同じ回答です。恐れ入ります。 –

0

上の任意の管理者権限がIPアドレスの使用法は、ローカルネットワークに動作していないことなく、私のために動作します。私はMACアドレスを取得するためにいくつかの方法を使用しました - 有用なコマンドのsysout解析。

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

これはどこでも動作します。少なくとも、Ubuntuマシン上でこのメソッドの使用方法は、次のような結果得られます。ここでは

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

私の質問を読んでください、私はリモートコンピュータのMACが必要です...私自身ではありません。 – Nexus2k

関連する問題