设置java URLConnection的用户代理

我试图用URLConnectionparsing一个使用Java的网页。 我尝试设置这样的用户代理:

java.net.URLConnection c = url.openConnection(); c.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); 

但是最终的用户代理是我指定的用户代理,最后附加了“Java / 1.5.0_19”。 有没有办法真正设置用户代理没有这个补充?

另外,将http.agent系统属性设置为""可能会诀窍(我没有在我面前的代码)。

你可能会逃避:

  System.setProperty("http.agent", ""); 

但是这可能需要你和URL协议处理程序的初始化之间的竞争,如果它在启动时caching值(实际上,我不认为它)。

该属性也可以通过JNLP文件(可用于6u10的applet)和命令行来设置:

 -Dhttp.agent= 

或者用于包装器命令:

 -J-Dhttp.agent= 

只是为了澄清:setRequestProperty工作得很好! 至less用Java 1.6.30。

我用netcat(一个端口监听器)在我的机器上监听:

 $ nc -l -p 8080 

它只是监听端口,所以你可以看到任何被请求的东西,比如原始的http-headers。

并没有setRequestProperty得到了下面的http标题:

 GET /foobar HTTP/1.1 User-Agent: Java/1.6.0_30 Host: localhost:8080 Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 Connection: keep-alive 

并与setRequestProperty:

 GET /foobar HTTP/1.1 User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 Host: localhost:8080 Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 Connection: keep-alive 

正如你所看到的,用户代理是正确设置的。

完整的例子:

 import java.io.IOException; import java.net.URL; import java.net.URLConnection; public class TestUrlOpener { public static void main(String[] args) throws IOException { URL url = new URL("http://localhost:8080/foobar"); URLConnection hc = url.openConnection(); hc.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2"); System.out.println(hc.getContentType()); } } 

稍微改变汤姆Hawtins回答:

  System.setProperty("http.agent", ""); 

根据http://www.ivoa.net/forum/apps/0903/0610.htm