在Java开发中,获取域名是一个常见的需求,无论是用于网络请求、日志记录还是系统配置等场景,准确获取域名信息都能提升程序的灵活性和可维护性,本文将详细介绍Java中获取域名的多种方法,涵盖从基础的网络请求到系统属性获取,并结合实际场景分析不同方法的适用性。

通过HTTP请求获取目标域名
当需要与外部服务交互时,通常可以通过HTTP请求获取目标服务器的域名信息,Java的java.net包提供了HttpURLConnection类,支持发送HTTP请求并获取响应头信息,其中Location字段或Host字段可能包含域名数据。
示例代码:
import java.net.HttpURLConnection;
import java.net.URL;
public class GetDomainFromHttp {
public static void main(String[] args) {
try {
URL url = new URL("https://www.example.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("HEAD");
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
String host = connection.getURL().getHost();
System.out.println("目标域名: " + host);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意事项:
- 此方法仅适用于可访问的HTTP/HTTPS服务,且目标服务器需返回正确的
Host信息。 - 对于需要重定向的URL,需通过
connection.getURL().getHost()获取最终跳转后的域名。
解析URL对象获取域名
若已知完整的URL字符串,可直接通过java.net.URL类解析出域名信息,该方法无需发送网络请求,效率较高,适用于本地处理已知URL的场景。
示例代码:
import java.net.URL;
public class ParseDomainFromUrl {
public static void main(String[] args) {
try {
URL url = new URL("https://sub.example.com:8080/path?query=1");
String host = url.getHost();
System.out.println("解析域名: " + host);
// 获取端口号(默认80)
int port = url.getPort();
System.out.println("端口号: " + (port == -1 ? url.getDefaultPort() : port));
} catch (Exception e) {
e.printStackTrace();
}
}
关键点:

getHost()方法返回URL中的主机名,不包含协议和路径。- 若URL中未明确指定端口号(如
https://example.com),getPort()返回-1,需结合getDefaultPort()获取默认值。
通过InetAddress类获取本地域名
若需获取当前运行环境的本地域名或主机名,可使用java.net.InetAddress类,该方法适用于需要本地系统网络配置信息的场景。
示例代码:
import java.net.InetAddress;
public class GetLocalDomain {
public static void main(String[] args) {
try {
InetAddress localHost = InetAddress.getLocalHost();
String hostname = localHost.getHostName();
String canonicalName = localHost.getCanonicalHostName();
System.out.println("本地主机名: " + hostname);
System.out.println("规范域名: " + canonicalName);
} catch (Exception e) {
e.printStackTrace();
}
}
}
说明:
getHostName()返回本地主机配置的名称,可能为简写形式(如DESKTOP-ABC123)。getCanonicalHostName()返回完整的规范域名,可能涉及DNS反向解析,耗时较长。
通过系统属性获取域名信息
Java系统属性中存储了部分与本地环境相关的信息,可通过System.getProperty()获取,该方法无需依赖网络,适合快速获取基础配置。
常用系统属性:
os.name:操作系统名称user.name:当前用户名java.vm.name:JVM名称
示例代码:
public class GetDomainFromSystemProps {
public static void main(String[] args) {
String osName = System.getProperty("os.name");
String userName = System.getProperty("user.name");
System.out.println("操作系统: " + osName);
System.out.println("当前用户: " + userName);
// 注意:Java系统属性中通常不直接存储域名
// 需结合其他方式(如读取/etc/hosts或调用系统命令)获取
}
}
局限性:

- 标准Java系统属性不直接包含域名信息,需结合操作系统特定文件或命令行工具扩展。
结合正则表达式提取域名
在处理文本数据(如日志文件、HTML内容)时,可能需要通过正则表达式匹配域名,该方法灵活性高,但需注意匹配规则的准确性。
示例代码:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ExtractDomainWithRegex {
public static void main(String[] args) {
String text = "访问 https://www.test.com 或 http://sub.domain.org 获取信息";
String regex = "https?://([a-zA-Z0-9.-]+)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println("提取域名: " + matcher.group(1));
}
}
}
正则表达式说明:
https?:匹配http或https。([a-zA-Z0-9.-]+):匹配域名主体,包含字母、数字、点号和连字符。
实际场景选择建议
- 网络请求场景:优先使用
HttpURLConnection或第三方库(如Apache HttpClient)获取目标域名。 - 本地环境配置:通过
InetAddress获取主机名或规范域名。 - 文本解析需求:结合正则表达式灵活提取域名。
- 跨平台兼容性:注意不同操作系统下主机名解析的差异,避免硬编码域名。
注意事项
- 异常处理:网络操作(如
HttpURLConnection)需处理IOException,本地操作需处理SecurityException。 - 性能考虑:频繁调用
InetAddress.getCanonicalHostName()可能影响性能,建议缓存结果。 - 安全性:验证域名合法性,防止注入攻击(如通过正则表达式过滤非法字符)。
通过以上方法,开发者可根据具体需求选择合适的方案获取域名信息,在实际项目中,往往需要结合多种技术手段,例如先通过系统属性获取本地主机名,再通过网络请求验证目标域名,以确保数据的准确性和完整性。

















