给定一个 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 许可协议
如果要解析 URL,请使用
java.net.URI
。java.net.URL
有很多问题—它的equals
方法进行DNS查找,这意味着使用它的代码在与不受信任的输入一起使用时容易受到拒绝服务攻击。“Gosling 先生——你为什么让 url 等于烂?” 解释了一个这样的问题。只要养成使用
java.net.URI
的习惯。应该做你想做的。
您编写的代码对于有效 URL 失败:
httpfoo/bar
-- 具有以http
开头的路径组件的相对 URL。HTTP://example.com/
协议不区分大小写。//example.com/
-- 与主机的协议相对 URLwww/foo
-- 具有以www
开头的路径组件的相对 URLwwwexample.com
-- 不以www.
开头但以www
--- 开头的域名。分层 URL 具有复杂的语法。如果您在没有仔细阅读 RFC 3986 的情况下尝试使用自己的解析器,您可能会弄错。只需使用内置于核心库中的那个。
如果您确实需要处理
java.net.URI
拒绝的混乱输入,请参阅 RFC 3986 附录 B: