设置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", "");