【问题标题】:Is url.openStream harmful?url.openStream 有害吗?
【发布时间】:2010-06-07 02:24:52
【问题描述】:

我使用java.net.URL.openStream() 方法从服务器检索内容。我最近遇到了一个问题,其中 HTTP 响应代码指示错误,但不是抛出异常,而是仍然读取流。这导致错误在执行过程中很晚才出现,并被证明是一个红鲱鱼。据我所知,当您使用此方法打开流时,无法检查 HTTP 响应代码。

我能找到正确处理此问题的唯一方法是在打开流之前获得连接

HttpURLConnection conn=(HttpURLConnection) url.openConnection()
#Code updated with scotth's suggestion
if(!String.valueOf(conn.getResponseCode()).startsWith('2'))
    throw new IOException("Incorrect response code "+conn.getResponseCode()+" Message: " +getResponseMessage());
rawIn=conn.getInputStream()

InputStream in=conn.getInputStream()

所以你同意吗?是否有安全使用 openStream 的良好环境,或者是否应该不鼓励使用它。值得注意的是,Sun 在他们的tutorial code for reading directly from a URL 中使用了该方法。话又说回来,代码会抛出异常,因此它并不完全是良好编码实践的堡垒。

【问题讨论】:

    标签: java networking


    【解决方案1】:

    openStream() 如果您希望您的类不受 url 类型更改的影响 - 例如在绝对文件路径 (file:///)、jar 包含的资源以及可能其他协议甚至可能使用自定义协议处理程序 (scotth://foo.bar)。

    但是,由于您发现它的抽象程度非常高,因此如果您想了解有关与资源交互性质的任何细节,您需要openConnection() 并按您认为合适的方式进行转换。

    Re:其他状态代码 - 你可能想看看 RFC2616 - 如果你关心的是“成功”,你可以检查 String.valueOf(conn.getResponseCode()).startsWith('2')

    【讨论】:

      猜你喜欢
      • 2012-04-30
      • 2011-05-21
      • 1970-01-01
      • 2012-11-24
      • 2019-11-23
      • 2012-06-15
      • 2014-11-24
      • 2014-10-01
      • 2010-12-31
      相关资源
      最近更新 更多