当前位置: 首页 > 面试题库 >

Java从给定的URL获取域名

柯苗宣
2023-03-14
问题内容

给定一个URL,我想提取域名(它不应包含“ www”部分)。网址可以包含h​​ttp / https。这是我编写的Java代码。尽管它似乎运行良好,但是有没有更好的方法或有一些极端的情况可能会失败。

public static String getDomainName(String url) throws MalformedURLException{
    if(!url.startsWith("http") && !url.startsWith("https")){
         url = "http://" + url;
    }        
    URL netUrl = new URL(url);
    String host = netUrl.getHost();
    if(host.startsWith("www")){
        host = host.substring("www".length()+1);
    }
    return host;
}

输入:http : //google.com/blah

输出:google.com


问题答案:

如果要解析URL,请使用java.net.URI。 java.net.URL有很多问题-它的equals方法进行DNS查找,这意味着与不可信输入一起使用时,使用它的代码可能容易受到拒绝服务攻击的攻击。

“戈斯林先生-为什么要使网址等于糟透了?” 解释了一个这样的问题。只是养成使用java.net.URI代替的习惯。

public static String getDomainName(String url) throws URISyntaxException {
URI uri = new URI(url);
String domain = uri.getHost();
return domain.startsWith(“www.”) ? domain.substring(4) : domain;
}
应该做你想做的。


尽管它似乎运行良好,但是有没有更好的方法或有一些极端的情况可能会失败。

你编写的代码对有效的URL无效:

  • httpfoo/bar-相对URL带有以http。开头的路径组件。
  • HTTP://example.com/-协议不区分大小写。
  • //example.com/ -主机的协议相对URL
  • www/foo-相对URL的路径部分以 www
  • wwwexample.com-这不域名开头www.,但开始用www

分层URL具有复杂的语法。如果你尝试不仔细阅读RFC 3986而推出自己的解析器,则可能会弄错。只需使用核心库中内置的一个即可。

如果你确实需要处理java.net.URI拒绝的混乱输入,请参阅RFC 3986附录B:

附录B.使用正则表达式解析URI引用
由于“首次匹配获胜”算法与POSIX正则表达式使用的“贪婪”消歧方法相同,因此使用正则表达式解析URI引用的潜在五个组成部分是自然而普遍的。

下一行是用于将格式正确的URI引用分解为其组件的正则表达式。

  ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
   12            3  4          5       6  7        8 9

上面第二行中的数字仅用于增强可读性。它们指示每个子表达式(即,每个成对的括号)的参考点。



 类似资料:
  • 问题内容: 我想知道java中是否有解析器或库可用于提取URL中的第二级域(SLD)-或无法通过算法或正则表达式来执行此操作。例如: 打印: 现在,我想做的就是可靠地识别SLD(“ ltd.uk”)组件。有任何想法吗? 编辑: 我理想上正在寻找一个通用的解决方案,所以我会匹配“ police.uk”中的“ .uk”,“ bbc.co.uk”中的“ .co.uk”和“ amazon”中的“ .com

  • 问题内容: 例如,地址为: 我想将子域保存到变量中,这样我就可以这样做; 问题答案: 会将URL拆分为协议,位置,端口等。然后,您可以通过拆分位置来获得子域。

  • 问题内容: 我需要从给定的URL中提取完整的协议,域和端口。例如: 问题答案: 首先获取当前地址 然后只需解析该字符串 您的网址是: 希望这可以帮助

  • 问题内容: 我正在解析CSS,以便从链接的样式表中获取URL。这是一个Java应用程序。( 我尝试使用CSSParser( http://cssparser.sourceforge.net/ ),但是,它在解析时会默默地删除许多规则。) 所以我只是在使用Regex。我想要一个仅获取URL的正则表达式,并且足够健壮以应对来自狂野的真实CSS: 你明白了。这是在Java的regex实现中( 不是我的最

  • 问题内容: 我正在尝试阅读以下图片 但是它显示了IIOException。 这是代码: 问题答案: 您收到(错误请求)错误,因为您的网址中有。如果在参数之前对其进行了修复,则会收到错误消息(未经授权)。也许您需要一些HTTP标头才能将您的下载标识为可识别的浏览器(使用“ User-Agent”标头)或其他身份验证参数。 对于User-Agent示例,然后通过连接inputstream 使用Imag

  • 问题内容: 我需要编写一个函数来解析包含域名的变量。最好用一个示例来说明,变量可以包含以下任何内容: 但是当通过我的函数传递时,所有这些都必须返回example.com或example.co.uk,基本上是根域名。我敢肯定我之前已经做过,但是我已经搜索Google约20分钟了,找不到任何东西。任何帮助,将不胜感激。 编辑:忽略.co.uk,假定通过此功能的所有域都具有3个字母的TLD。 问题答案: