How to get uuid or mac address from client in Java?

后端 未结 3 1384
一个人的身影
一个人的身影 2020-12-30 17:04

I\'m looking for a solution for a Java based webapplication to uniquely identify the client. The server is in the same network as the clients and I thought that using the MA

相关标签:
3条回答
  • 2020-12-30 17:45

    The best I could find is this: Query ARP cache to get MAC ID

    And the potted summary is that:

    • there is no standard Java API,
    • there is no operating system independent solution,
    • your application typically needs to be privileged (e.g. root access) to query the host's ARP cache, and
    • if the packets go through a network router, you won't be able to identify the source MAC address anymore.

    I don't think this is a good approach for identifying your user's machine.

    Consider also that:

    • This only identifies the machine, not the user. Some computers are shared by multiple users.
    • MAC addresses can be changed too.
    0 讨论(0)
  • 2020-12-30 17:50

    Usage of IP address isn't working in the local network. I have used some other method to get a MAC address - sysout parsing of useful commands.

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

    This should work everywhere. At least, the usage of this method on Ubuntu machine gives the following result:

    Operating System is Linux
    line eth0      Link encap:Ethernet  HWaddr f4:6d:04:63:8e:21  
    mac: f4:6d:04:63:8e:21
    
    0 讨论(0)
  • 2020-12-30 17:57

    I wrote my own method to solve my issue. Here it is if ever someone needs code to find a MAC address in the same network. Works for me without any admin privileges on Win 7 and 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 讨论(0)
提交回复
热议问题