Java WebStart应用程序如何获取访问我的网页的MAC地址



我正在编写一个从网站部署的java webstart应用程序,这样用户就可以点击并运行我的软件。我需要一种唯一的机器标识,以避免滥用对文件的访问。我想使用客户端的MAC地址作为唯一密钥,这样服务器就可以确保没有客户端下载过多。

当然,一个用户可能有多个网卡,那么我的Java应用程序如何确定用户用于访问我的网站的网卡的MAC地址呢?

机器标识。。

为什么不做一种"会话识别"呢?作为每个应用程序。加载(您可能希望实现SingleInstanceService以强制每台电脑使用一个应用程序),让它与服务器联系以建立一个唯一的会话。使用它为每个请求识别它。

阻止用户"用完"他们的津贴并停止/重新启动应用程序。(在一段时间内),使用PersistenceService存储一些详细信息。

您可以使用java.net.NetworkInterface.getNetworkInterfaces来获取网络接口,并在这些接口上调用getHardwareAddress()来获取MAC地址。

您可能需要使用if.isLoopBack()过滤掉环回(其中"if"是接口对象)。还要过滤掉if.getHardwareAddress()返回null的任何接口。然后挑选一个。如果.getName(),您可以按名称对它们进行排序,然后取第一个。出于您的目的,它是否是用于下载文件的实际界面并不重要,只是您可以以某种方式识别计算机。最后,如果.getHardwareAddress()为您提供一个带有MAC地址的字节数组。如果您想要一个字符串,请使用"%02x".format(字节)格式化每个字节,并使用":"作为分隔符将它们连接起来。

正如另一个答案中所建议的那样,使用PersistenceService可能会更好。

但是,如果您想在不同的计算机上为同一用户保留不同的数据,并且用户在每台计算机上都有相同的文件/主目录,那么使用MAC地址可能会很有用。您可以使用MAC地址作为传递给PersistenceService#create()和get()的URL的一部分。如果您想要的是每台计算机的数据,而不是每用户的数据,则非常有用。

Scala代码的简短示例:

def computerID: String = {
  try { // mac address of first network interface
    return java.net.NetworkInterface.getNetworkInterfaces
    .filter(!_.isLoopback)
    .filter(_.getHardwareAddress != null)
    .toList.sortBy(_.getName).head
    .getHardwareAddress.map("%02x".format(_)).mkString(":")
  } catch {
    case _ => return "0" // no mac address available? use default "0"
  }
}

最新更新