【问题标题】:How to check if URL is blocked by my firewall如何检查 URL 是否被我的防火墙阻止
【发布时间】:2026-01-23 02:30:01
【问题描述】:

我正在尝试检查该 URL 是否可访问。我正在使用 HttpURLConnection 。现在我正在实施它。

public static boolean isUrlAccessible(final String urlToValidate)
            throws WAGException {
        URL url = null;
        HttpURLConnection huc = null;
        int responseCode = -1;
        try {
            url = new URL(urlToValidate);
            huc = (HttpURLConnection) url.openConnection();
            huc.setRequestMethod("HEAD");
            huc.connect();
            responseCode = huc.getResponseCode();
        } catch (final UnknownHostException e) {
            e.printStackTrace();
            System.out.println(e.getMessage()+" "+e.getLocalizedMessage());
            return false;
        } catch (final MalformedURLException e){
            e.printStackTrace();
            System.out.println(e.getMessage()+" "+e.getLocalizedMessage());
            return false;
        } catch (ProtocolException e) {
            e.printStackTrace();
            System.out.println(e.getMessage()+" "+e.getLocalizedMessage());
            return false;
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println(e.getMessage()+" "+e.getLocalizedMessage());
            return false;
        } finally {
            if (huc != null) {
                huc.disconnect();
            }
        }
        return responseCode == 200;
    }

当 Internet 出现故障时,它会引发 UnknownHostException,我想知道如何检查防火墙是否阻止了 URL,这就是我得到异常的原因,而不是因为 URL 不可访问。另外,我只是检查响应代码 200 以确保 URL 可访问。我还需要执行其他检查吗?

【问题讨论】:

  • 观察:如果您使用的是 Java 7+,您可以使用 multi-catch 来减少每个单独的 catch 块中的代码重复。
  • 这真的取决于您的防火墙实施。它可能是超时(如果防火墙只是丢弃数据包),如果防火墙拒绝它们,则可能是另一种形式的 ioexception,或者如果您有某种过滤代理,则可能是更高级别的东西。在这种情况下,它可能会返回 403,这很难与常规响应区分开来,除非您知道要查找什么。
  • @JnoK - 感谢您的意见。没想到。稍后我将以不同的方式处理每个异常,所以我想我将不得不为不同的异常设置不同的 catch 块。
  • 好的,我想我会以通用的方式处理这些异常。有关状态代码检查的任何输入?我只检查 200 还是应该考虑 300 等?
  • 一般来说,您无法可靠地区分“被防火墙阻止”和“网络错误”。

标签: java url firewall httpconnection


【解决方案1】:

当 Internet 出现故障时,它会抛出 UnknownHostException

不,当 DNS 关闭或 DNS 不知道主机时,它会抛出该错误。

我想知道如何检查防火墙是否阻止了 URL

您将获得连接超时。在硬件过时的极少数情况下,您可能会拒绝连接,但本世纪我还没有听说过。但是,如果主机关闭,您也会收到连接超时。

我只是检查响应代码 200 以确保 URL 可访问。我还需要执行其他检查吗?

没有。但是 URL 不会被防火墙阻止。 端口被防火墙阻止。

【讨论】:

    【解决方案2】:

    当防火墙阻止连接时,我通常看到的异常是“java.net.NoRouteToHostException”。试着抓住它,看看它是否有帮助。

    【讨论】:

    • 其他人是否看到相同的东西完全取决于防火墙。
    • 不,不是。那时您的本地主机不知道如何到达那里,例如到私有 IP 地址。与防火墙无关。
    • 对不起,我错过了什么值得投反对票?我正在查看文档,请参阅此处docs.oracle.com/javase/7/docs/api/java/net/…,并且由于 OP 提到了防火墙,我表示这是我们看到的最常见的异常,如果防火墙阻止了连接?
    • 文档似乎有误。防火墙无法控制源路由。您没有任何证据表明这是最常见的症状。
    【解决方案3】:

    正如其他人所说,答案是“视情况而定”。 例如,我们的外围防火墙执行重定向,因为我们想向用户显示自定义屏幕。 在这种情况下,我会尝试查看 HTTP 状态代码 (30x)。

    我认为很难为这样的东西编写通用函数,您需要根据您的设置对其进行调整或使其非常可配置。

    请确保尽可能保持通用性。 例如,如果您的代码假设重定向到特定 URL,那么一旦基础架构发生更改(这种情况发生的频率比预期的要高),这将发生故障。

    【讨论】:

      最近更新 更多