26

我的代码是这样的:

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

解决办法是什么?

4

3 回答 3

52

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

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

然而,只允许某些类型的用户代理是个好主意。这将使您的网站安全并降低带宽使用率。

您可能希望从您的服务器阻止一些可能的不良“用户代理”,具体取决于您是否不希望人们窃取您的内容和带宽。但是,正如您在上面的示例中所见,用户代理可能会被欺骗。

于 2011-01-25T19:05:44.070 回答
4

403 表示禁止。从这里:-

10.4.4 403 禁止

服务器理解请求,但拒绝执行。授权将无济于事,并且不应重复请求。如果请求方法不是 HEAD 并且服务器希望公开请求未完成的原因,它应该在实体中描述拒绝的原因。如果服务器不希望向客户端提供此信息,则可以使用状态代码 404(未找到)来代替。

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

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

10.4.8 407 需要代理验证

此代码类似于 401(未授权),但表示客户端必须首先通过代理验证自己。代理必须返回一个 Proxy-Authenticate 头字段(第 14.33 节),其中包含适用于所请求资源的代理的质询。客户端可以使用合适的 Proxy-Authorization 头域(第 14.34 节)重复请求。HTTP 访问认证在“HTTP 认证:基本和摘要式访问认证”中进行了说明

另请参阅此相关问题。

于 2011-01-25T18:55:07.007 回答
2

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

  • 该站点设置了一个cookie(可能在登录期间)。您可能能够在代码中处理此问题,您必须显式添加对传递 cookie 的支持。这是最有可能的。

  • 该站点基于用户代理进行过滤。您可以设置用户代理。这不太可能。

于 2011-01-25T19:06:22.793 回答