我正在尝试获取CSV格式的网页以用作基本数据库。测试页面位于http://prog.bhstudios.org/bhmi/database/get,浏览器打开它没问题。但是,当我运行以下代码时,Java会抛出403错误:
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Main
{
static
{
Logger.getGlobal().setLevel(Level.ALL);
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException
{
InputStream is = null;
try
{
System.out.println("Starting...");
URL url = new URL("http://prog.bhstudios.org/prog/bhmi/database/get/");
URLConnection urlc = url.openConnection();
urlc.connect();
is = urlc.getInputStream();
int data;
while ((data = is.read()) != -1)
{
System.out.print((char)data);
}
System.out.println("\r\nSuccess!");
}
catch (IOException ex)
{
Logger.getGlobal().log(Level.SEVERE, ex.getMessage(), ex);
System.out.println("\r\nFailure!");
}
if (is != null)
is.close();
}
}
这是控制台输出:
Starting...
Nov 18, 2013 3:01:48 PM org.bh.mi.Main main
SEVERE: Server returned HTTP response code: 403 for URL: http://prog.bhstudios.org/prog/bhmi/database/get/
java.io.IOException: Server returned HTTP response code: 403 for URL: http://prog.bhstudios.org/prog/bhmi/database/get/
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1626)
at org.bh.mi.Main.main(Main.java:36)
Failure!
请注意, 403表示服务器已启用且已正确接受请求,但拒绝执行任何操作。 现在这里是踢球者:如果我得到,比如http://example.com,它就可以了!
如何让我的Java应用程序从我的网络服务器读取此文件?
答案 0 :(得分:3)
我针对您的服务器进行了测试,如果我使用TamperData提交请求 - User-Agent: Java/1.6.0_14
(我刚刚选择了一个随机的java版本),您的网络服务器就会响应403 Forbidden。
我的浏览器显示以下错误消息:
错误1010
访问被拒绝 发生了什么事?
此网站的所有者(prog.bhstudios.org)已根据您的浏览器签名禁止您访问(cf7ab9f58210755-ua21)。
换句话说,您的服务器(或者更可能是:您的代理,因为标题都指示使用cloadflare-nginx和ASP.net)基于用户代理字符串进行过滤。这可能是为了防止僵尸程序和屏幕分析器访问您的网站。
您需要删除此过滤器(询问代理管理员),或为URLConnection
设置其他用户代理,请参阅Setting user agent of a java URLConnection和How to modify the header of a HttpUrlConnection
答案 1 :(得分:2)
由于某种原因,您的服务器配置为在请求标头
时禁止访问User-Agent: Java/...
存在。我能够重现这个问题,并通过
让它工作URLConnection urlc = url.openConnection();
urlc.setRequestProperty("User-Agent", "");
urlc.connect();