如何检查Java中是否存在域?

如何检查Java中是否存在域?,java,Java,假设我的电子邮件地址是xyz@yahoo.com我想检查yahoo.com是否为有效域 有人能告诉我我可以使用哪种Java API吗?我不知道这是否是最好的方法,但我为VB.NET程序做了类似的事情: 我刚刚ping了该域,如果没有得到回复,该域要么离线,要么不存在。您可以做的一件事是尝试解析“yahoo.com”。大概是这样的: public static void main(String[] args) throws UnknownHostException { InetAddres

假设我的电子邮件地址是
xyz@yahoo.com
我想检查
yahoo.com
是否为有效域


有人能告诉我我可以使用哪种Java API吗?

我不知道这是否是最好的方法,但我为VB.NET程序做了类似的事情:


我刚刚ping了该域,如果没有得到回复,该域要么离线,要么不存在。

您可以做的一件事是尝试解析“yahoo.com”。大概是这样的:

public static void main(String[] args) throws UnknownHostException {
    InetAddress inetAddress = InetAddress.getByName("yahoo.com");
    System.out.println(inetAddress.getHostName());
    System.out.println(inetAddress.getHostAddress());
}
哪些产出:

yahoo.com
67.195.160.76

InetAddress
提供了一种方法来确定给定主机名称的主机的IP地址

如果找不到主机的IP地址(如果给定的主机名无效),将抛出


因此,在调用
InetAddress.getByName()
时,您只需捕获一个
UnknownHostException
。如果捕获到
UnknownHostException
,则表示您输入的主机名无效。

另一种可能是检查输入域的MX

它不是JavaAPI,但是您可以随时解析HTML响应

这意味着,如果邮件服务提供商没有被列入黑名单,它可能是安全的,并且是一个真实的地址

但正如前面所说的,某些服务器总是可以为此类服务定义安全限制

还有一点,有些服务提供临时电子邮件(mailinator.com、jetable.org等)。如果您想阻止用户注册此类电子邮件,您还必须检查这些域

更新

谷歌提供了一个看似免费的网站

示例:返回包含以下JSON的页面:

{
  "Status": 0,
  "TC": false,
  "RD": true,
  "RA": true,
  "AD": false,
  "CD": false,
  "Question": [
    {
      "name": "amazon.com.",
      "type": 15
    }
  ],
  "Answer": [
    {
      "name": "amazon.com.",
      "type": 15,
      "TTL": 724,
      "data": "5 amazon-smtp.amazon.com."
    }
  ]
}

您可以使用org.apache.commons.validator.routines.DomainValidator

首先添加maven依赖项

<dependency>
        <groupId>commons-validator</groupId>
        <artifactId>commons-validator</artifactId>
        <version>1.6</version>
</dependency>

你想检查它是否也是一个有效的电子邮件地址,也许?你不能检查一个域是否有效。或者,您可以检查格式是否有效,但这并不意味着该域存在。检查DNS服务器是否可以解析DOMAIN.TLD,如果可以,则它是有效的域。2.检查internic.net whois服务的结果,比如你能找到一个适用于所有顶级域名的internic吗?你链接到的那个不支持“.st”因为安全问题,有很多域不响应ping。它没有给出很多关于如何在Java中执行此操作的信息。据我所知,你可能会得到误报。我支持代理,因此我无法测试该代码,但例如,域“.st”下的所有内容回答您正在使用浏览器。例如,您可以使用文本adjlafdjlks。st@Kaj你能解释一下原因吗?我用“adjlafdjlks.st”尝试了我的代码,我得到的答案(195.178.160.40)与
nslookup adjlafdjlks.st
返回的结果完全相同。是的,这意味着你得到了误报。在“.st”域下未注册的所有域都被视为有效域,因为它们被定向到该域的域注册器。因此,所有内容都将返回一个地址,但这并不意味着它们有效且正在使用。@Kaj:嗯,既然
nslookup
具有相同的行为,我想这是一个例外,而不是误报。如果有这样的域,您可以添加一个主机名黑名单,检查失败(可能有一个特定的例外),这就是为什么我在这个线程中说,您不能创建一个适用于所有域的域检查解决方案。“.st”不是唯一一个这样处理的顶级域。我从来没有看到一个很好的理由来解释为什么有人想要检查一个域是否有效。这不是他要求的。不是验证格式,而是它是否可以解析为正确的ip
boolean isValid = DomainValidator.getInstance().isValid("yahoo.com");