Java从给定的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
回答:
如果要解析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/
-主机的协议相对URLwww/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获取域名 的全部内容, 来源链接: utcz.com/qa/433455.html