Java中如何实现URL服务器名称提取函数

来源:网络学院作者:清原小日向头衔:网络博主
导读:本期聚焦于小伙伴创作的《Java中如何实现URL服务器名称提取函数》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Java中如何实现URL服务器名称提取函数》有用,将其分享出去将是对创作者最好的鼓励。

在Java开发中,从URL中提取服务器名称是常见需求,比如统计不同域名的访问量、做接口鉴权时校验请求来源等场景都会用到。服务器名称指的是URL中协议和路径之间的部分,包含主机名和端口(如果有端口的话)。

Java中如何实现URL服务器名称提取函数

方法一:使用Java内置URL类实现

Java标准库的java.net.URL类已经封装了URL的解析逻辑,我们可以直接调用它的getHost()方法获取服务器名称,这种方式不需要自己处理复杂的URL格式,兼容性更好。

实现步骤

  • 首先将字符串形式的URL转换为URL对象
  • 调用URL对象的getHost()方法获取主机名
  • 如果需要包含端口,再调用getPort()方法,端口为-1表示使用默认端口,不需要拼接

完整代码示例

import java.net.URL;

public class UrlServerNameExtractor {
    /**
     * 使用URL类提取服务器名称,包含端口(如果有非默认端口)
     * @param urlStr 完整的URL字符串
     * @return 服务器名称,解析失败返回null
     */
    public static String extractServerNameWithUrlClass(String urlStr) {
        try {
            URL url = new URL(urlStr);
            String host = url.getHost();
            int port = url.getPort();
            // 端口为-1表示使用默认端口,不需要拼接
            if (port != -1) {
                return host + ":" + port;
            }
            return host;
        } catch (Exception e) {
            // 处理URL格式错误的情况
            e.printStackTrace();
            return null;
        }
    }

    public static void main(String[] args) {
        // 测试不同的URL场景
        String[] testUrls = {
            "https://www.ipipp.com/path/page.html",
            "http://localhost:8080/api/user",
            "ftp://192.168.0.1:21/files",
            "https://www.ipipp.com:443/test"
        };
        for (String url : testUrls) {
            String serverName = extractServerNameWithUrlClass(url);
            System.out.println("URL: " + url);
            System.out.println("服务器名称: " + serverName);
            System.out.println("------");
        }
    }
}

方法二:使用字符串分割方式实现

如果不想依赖URL类,也可以通过字符串分割的方式手动提取服务器名称,这种方式更轻量,但需要自己处理各种边界情况。

实现逻辑

首先找到协议分隔符://的位置,然后截取后面的内容,再找到第一个/的位置,截取前面的部分就是服务器名称,同时需要处理没有路径的情况。

完整代码示例

public class UrlServerNameExtractorBySplit {
    /**
     * 使用字符串分割方式提取服务器名称
     * @param urlStr 完整的URL字符串
     * @return 服务器名称,解析失败返回null
     */
    public static String extractServerNameBySplit(String urlStr) {
        if (urlStr == null || urlStr.isEmpty()) {
            return null;
        }
        // 查找协议分隔符的位置
        int protocolIndex = urlStr.indexOf("://");
        if (protocolIndex == -1) {
            // 没有协议的情况,直接按路径分割
            int pathIndex = urlStr.indexOf("/");
            if (pathIndex == -1) {
                return urlStr;
            }
            return urlStr.substring(0, pathIndex);
        }
        // 截取协议后面的内容
        String afterProtocol = urlStr.substring(protocolIndex + 3);
        // 查找第一个路径分隔符的位置
        int pathIndex = afterProtocol.indexOf("/");
        if (pathIndex == -1) {
            // 没有路径的情况,整个afterProtocol就是服务器名称
            return afterProtocol;
        }
        return afterProtocol.substring(0, pathIndex);
    }

    public static void main(String[] args) {
        // 测试不同的URL场景
        String[] testUrls = {
            "https://www.ipipp.com/path/page.html",
            "http://localhost:8080/api/user",
            "ftp://192.168.0.1:21/files",
            "https://www.ipipp.com:443/test",
            "www.ipipp.com/test" // 无协议的情况
        };
        for (String url : testUrls) {
            String serverName = extractServerNameBySplit(url);
            System.out.println("URL: " + url);
            System.out.println("服务器名称: " + serverName);
            System.out.println("------");
        }
    }
}

两种方法的对比

我们可以通过下面的表格对比两种实现方式的优缺点,方便根据实际场景选择:

对比项URL类实现字符串分割实现
实现复杂度低,直接调用内置方法高,需要手动处理边界逻辑
兼容性好,支持各种标准URL格式一般,特殊格式URL容易解析错误
性能略低,需要创建URL对象,可能抛异常略高,纯字符串操作
适用场景处理标准URL,需要高兼容性处理简单URL,追求轻量实现

注意事项

  • 使用URL类时,如果URL格式不合法会抛出MalformedURLException,需要做好异常处理
  • 字符串分割方式无法处理包含特殊字符的非标准URL,比如URL中包含中文或者其他编码字符时容易出错
  • 如果只需要主机名不需要端口,直接使用getHost()方法即可,不需要额外拼接端口
  • 测试时要覆盖带端口、不带端口、无路径、无协议等多种场景,避免遗漏边界情况
实际开发中建议优先使用URL类的实现方式,虽然性能略低,但兼容性和准确性更有保障,减少后续维护的成本。

JavaURL服务器名称提取字符串处理修改时间:2026-07-14 10:27:29

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。