我的代码是这样的:
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
解决方案是什么?
答案 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(可能在登录期间)。你或许可以处理 在代码中,你将不得不这样做 明确添加对传递的支持 饼干。这很有可能。
网站根据用户代理进行过滤。您可以设置用户代理。这不太可能。