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

时间:2012-01-11 16:12:37

标签: java web java-web-start mac-address

我正在编写一个java webstart应用程序,可以从网站进行部署,以便用户可以单击并运行我的软件。我需要一种独特的机器识别,以避免滥用文件的访问。我想将客户端的MAC地址用作唯一密钥,以便服务器可以确保没有客户端下载太多。

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

2 个答案:

答案 0 :(得分:7)

  

..机器识别..

为什么不做一种'会话识别'呢?作为每个应用。加载(您可能希望实现SingleInstanceService以在每台PC上强制执行一个应用程序。)让它联系服务器以建立唯一的会话。用它来识别每个请求。

阻止用户“用完”他们的津贴并停止/重新启动应用。 (在一个时间限制内),使用PersistenceService存储一些细节。

答案 1 :(得分:6)

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

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

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

如果您希望在用户在每台计算机上具有相同文件/ homedirs的情况下在不同计算机上为同一用户保留不同数据,则使用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"
  }
}