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

Ada*_*dao 20 java http http-status-code-403

我想从url下载mp3文件:"http://upload13.music.qzone.soso.com/30671794.mp3",我总是得到java.io.IOException:服务器返回HTTP响应代码:403为URL.但是使用浏览器打开网址时没关系.以下是我的代码的一部分:

BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
    URL url = new URL(link);

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

    String contentType = urlConn.getContentType();

    System.out.println("contentType:" + contentType);

    InputStream is = urlConn.getInputStream();
    bis = new BufferedInputStream(is, 4 * 1024);
    bos = new BufferedOutputStream(new FileOutputStream(
    fileName.toString()));?
Run Code Online (Sandbox Code Playgroud)

有人可以帮帮我吗?提前致谢!

Mon*_*uma 51

你也可以使用

System.setProperty("http.agent", "Chrome");
Run Code Online (Sandbox Code Playgroud)

它对我有用.

//更新

说明

因为HttpURLConnection读取属性"http.agent"如果设置.你可以在这里阅读:https://www.innovation.ch/java/HTTPClient/advanced_info.html

或者您可以在HttpURLConnection类的源代码中查找:

String agent = java.security.AccessController.doPrivileged(new sun.security.action.GetPropertyAction("http.agent"));

  • 哇魔术!你能解释背后的原因吗? (2认同)

小智 24

URLConnection如果你使用java,而不是在java中使用,HttpURLConnection你应该可以从java访问所请求的网页.请尝试以下代码:

 HttpURLConnection httpcon = (HttpURLConnection) url.openConnection(); 
 httpcon.addRequestProperty("User-Agent", "Mozilla/4.76"); 
Run Code Online (Sandbox Code Playgroud)

正常的java使用urlConnection不会被接受访问互联网.要访问浏览器,它需要在没有例外的情况下执行搜索HTTP response code : 403 for URL


编辑(@Mordechai):无需进行投射,只需添加用户代理即可.

  • **什么?**_"普通的java使用urlConnection不会被接受访问互联网"_这是不正确和误导.转换不会改变底层对象的内容,OP已经设置了User-Agent请求属性......这有多少upvotes? (5认同)
  • 转换为`HttpURLConnection`在这里不会改变任何东西,`url.openConnection()`返回的对象是相同的,无论你是否施放它. (3认同)
  • 它有这么多upvotes的原因是因为它实际上解决了问题,如果url连接没有添加请求属性,像我一样,人们在google中搜索并尝试这个并且它可以工作,但如果你只设置它也会工作`URLConnection.addRequestProperty("User-Agent","Mozilla/4.76")` (2认同)

Ale*_*gen 2

当我使用浏览器访问该 URL 时,我也会收到 403。也许您已使用浏览器登录该网站?

如果是这种情况,您需要从浏览器复制 cookie 并将其一起发送,如果网站进行任何额外检查,甚至可能需要执行更多操作来复制浏览器的签名。

您可以通过添加以下内容来设置 cookie:

urlConn.setRequestProperty("Cookie", "foo=bar"); 
Run Code Online (Sandbox Code Playgroud)

其中 foo=bar 是您在浏览器中找到该网站的 cookie 时会找到的键值对。