java.io.IOException:服务器返回HTTP响应代码:403表示URL

时间:2011-01-25 18:52:02

标签: java ioexception

我的代码是这样的:

URL url;
URLConnection uc;
StringBuilder parsedContentFromUrl = new StringBuilder();
String urlString="http://www.example.com/content/w2e4dhy3kxya1v0d/";
System.out.println("Getting content for URl : " + urlString);
url = new URL(urlString);
uc = url.openConnection();
uc.connect();
uc.getInputStream();
BufferedInputStream in = new BufferedInputStream(uc.getInputStream());
int ch;
while ((ch = in.read()) != -1) {
    parsedContentFromUrl.append((char) ch);
}
System.out.println(parsedContentFromUrl);

然而,当我尝试通过浏览器访问URL时没有问题,但是当我尝试通过java程序访问它时,它会抛出预期:

java.io.IOException: Server returned HTTP response code: 403 for URL

解决方案是什么?

3 个答案:

答案 0 :(得分:44)

uc.connect();uc.getInputStream();之间添加以下代码:

uc = url.openConnection();
uc.addRequestProperty("User-Agent", 
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");

但是,允许某些类型的用户代理是一个不错的主意。这将使您的网站安全,带宽使用率低。

您可能希望阻止某些可能不良的“用户代理”,具体取决于您是否希望人们泄露您的内容和带宽。但是,正如您在上面的示例中所看到的,用户代理可能会被欺骗。

答案 1 :(得分:4)

403表示禁止。来自here: -

  

10.4.4 403禁止

     

服务器理解请求,但是   拒绝履行它。   授权无济于事   请求不应重复。如果   请求方法不是HEAD和   服务器希望公开为什么   请求尚未完成,它   应该描述原因   拒绝实体。如果是服务器   不希望提供这些信息   可供客户使用,状态   可以使用代码404(未找到)   代替。

您需要与网站所有者联系,以确保正确设置权限。

编辑我看到了您的问题。我通过Fiddler运行了URL。我注意到我得到的是407,这意味着如下。这应该可以帮助你朝着正确的方向前进。

  

10.4.8 407需要代理身份验证

     

此代码与401类似   (未经授权),但表示该   客户必须首先验证自己   与代理。代理必须返回   Proxy-Authenticate头字段   (第14.33节)包含挑战   适用于代理人   请求的资源。客户可以   用合适的方式重复请求   代理授权标头字段   (第14.34条)。 HTTP访问   身份验证在“HTTP中解释”   身份验证:基本和摘要   访问身份验证“

另见相关问题。

答案 2 :(得分:2)

如果浏览器可以访问该页面,而您的代码不能访问该页面,那么浏览器请求和您的请求之间会有所不同。您可以使用Firebug查看浏览器请求,以查看差异。我能想到的一些事情是:

  • 该网站设置了一个 cookie(可能在登录期间)。你或许可以处理 在代码中,你将不得不这样做 明确添加对传递的支持 饼干。这很有可能。

  • 网站根据用户代理进行过滤。您可以设置用户代理。这不太可能。