You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java中识别协议相对URL以避免开放重定向?

识别协议相对URL的Java解决方案

针对你需要识别协议相对URL(如//hackerone.com@www.example.com)以避免开放重定向风险的需求,以下几个成熟Java库可以替代原生URI的判断逻辑,无需依赖简单正则匹配:

1. Apache Commons Validator

Apache Commons Validator提供了完善的URL校验工具,能够识别协议相对URL。

依赖(Maven)

<dependency>
    <groupId>commons-validator</groupId>
    <artifactId>commons-validator</artifactId>
    <version>1.7</version> <!-- 使用最新稳定版本 -->
</dependency>

示例代码

import org.apache.commons.validator.routines.UrlValidator;

private static boolean isAbsoluteOrProtocolRelativeURL(String url) {
    // ALLOW_ALL_SCHEMES 允许协议相对URL,同时支持标准绝对URL
    UrlValidator validator = new UrlValidator(UrlValidator.ALLOW_ALL_SCHEMES);
    // 额外判断协议相对URL的情况:以//开头且后续有有效域名部分
    boolean isProtocolRelative = url.startsWith("//") && url.length() > 2 && !url.substring(2).startsWith("/");
    return validator.isValid(url) || isProtocolRelative;
}

2. Spring Framework的UriComponentsBuilder

如果你已经使用Spring生态,UriComponentsBuilder可以解析协议相对URL,通过判断是否包含主机信息来识别这类URL。

示例代码

import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;

private static boolean isAbsoluteOrProtocolRelativeURL(String url) throws IllegalArgumentException {
    try {
        UriComponents components = UriComponentsBuilder.fromUriString(url).build();
        // 绝对URL有scheme,协议相对URL有host但无scheme
        return components.getScheme() != null || components.getHost() != null;
    } catch (IllegalArgumentException e) {
        return false;
    }
}

3. OkHttp的HttpUrl

OkHttp的HttpUrl对URL的解析非常严格,能准确识别协议相对URL,同时自带安全校验,适合处理涉及重定向的场景。

依赖(Maven)

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.12.0</version> <!-- 使用最新稳定版本 -->
</dependency>

示例代码

import okhttp3.HttpUrl;

private static boolean isAbsoluteOrProtocolRelativeURL(String url) {
    HttpUrl parsedUrl = HttpUrl.parse(url);
    if (parsedUrl == null) {
        return false;
    }
    // 绝对URL有scheme,协议相对URL有host但scheme为null(OkHttp会保留相对协议的状态)
    return parsedUrl.scheme() != null || parsedUrl.host() != null;
}

安全注意事项

无论使用哪个库,都需要额外校验URL的主机白名单,避免恶意构造的URL(如含@的混淆地址)导致开放重定向。例如在识别为合法URL后,检查主机是否在允许的列表内。

内容的提问来源于stack exchange,提问作者snakespan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 08:25:08