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

我的代码是这样的:

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 

解决办法是什么?

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

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

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

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

403表示禁止。 从这里 : –

10.4.4 403禁止

服务器理解请求,但拒绝履行请求。 授权无效,请求不应重复。 如果请求方法不是HEAD并且服务器希望公开为什么请求没有得到满足,那么它应该描述实体中拒绝的原因。 如果服务器不希望将此信息提供给客户端,则可以使用状态代码404(未找到)。

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

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

10.4.8 407需要代理身份validation

此代码类似于401(未授权),但表示客户端必须首先使用代理进行身份validation。 代理必须返回一个Proxy-Authenticate头字段(第14.33节),其中包含适用于所请求资源的代理的质询。 客户端可以使用合适的代理授权头字段重复该请求(第14.34节)。 “HTTP身份validation:基本和摘要访问身份validation”中介绍了HTTP访问身份validation

另请参阅此相关问题。

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

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

  • 该网站设置了一个cookie(可能在登录期间)。 您可以在代码中处理此问题,您必须明确添加对传递cookie的支持。 这很有可能。

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