从给定的url获取域名

新手上路,请多包涵

给定一个 URL,我想提取域名(它不应包含“www”部分)。网址可以包含 http/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

原文由 RandomQuestion 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

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

“Gosling 先生——你为什么让 url 等于烂?” 解释了一个这样的问题。只要养成使用 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 -- 具有以 http 开头的路径组件的相对 URL。
  • HTTP://example.com/ 协议不区分大小写。
  • //example.com/ -- 与主机的协议相对 URL
  • www/foo -- 具有以 www 开头的路径组件的相对 URL
  • wwwexample.com -- 不以 www. 开头但以 www --- 开头的域名。

分层 URL 具有复杂的语法。如果您在没有仔细阅读 RFC 3986 的情况下尝试使用自己的解析器,您可能会弄错。只需使用内置于核心库中的那个。

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

附录 B. 使用正则表达式解析 URI 引用

由于“first-match-wins”算法与 POSIX 正则表达式使用的“贪婪”消歧方法相同,因此使用正则表达式来解析 URI 引用的潜在五个组件是很自然和常见的。

以下行是将格式良好的 URI 引用分解为其组件的正则表达式。

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

上面第二行中的数字只是为了便于阅读;它们指示每个子表达式的参考点(即每个成对的括号)。

原文由 Mike Samuel 发布,翻译遵循 CC BY-SA 3.0 许可协议

import java.net.*;
import java.io.*;

public class ParseURL {
  public static void main(String[] args) throws Exception {

    URL aURL = new URL("http://example.com:80/docs/books/tutorial"
                       + "/index.html?name=networking#DOWNLOADING");

    System.out.println("protocol = " + aURL.getProtocol()); //http
    System.out.println("authority = " + aURL.getAuthority()); //example.com:80
    System.out.println("host = " + aURL.getHost()); //example.com
    System.out.println("port = " + aURL.getPort()); //80
    System.out.println("path = " + aURL.getPath()); //  /docs/books/tutorial/index.html
    System.out.println("query = " + aURL.getQuery()); //name=networking
    System.out.println("filename = " + aURL.getFile()); ///docs/books/tutorial/index.html?name=networking
    System.out.println("ref = " + aURL.getRef()); //DOWNLOADING
  }
}

阅读更多

原文由 Michael Tarimo 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题