为什么我不能设置Java http User-Agent?

时间:2011-08-07 16:16:45

标签: java networking user-agent httpurlconnection

我尝试像这样为http请求设置用户代理:

public BufferedReader readURL(String url){
        URL urlcon;
        BufferedReader in = null;
        try {
            urlcon = new URL(url);
            connection = (HttpURLConnection)urlcon.openConnection();

            System.setProperty("http.agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)");
            connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)");
            System.out.println(connection.getHeaderField("User-Agent"));
            connection.connect();
            in = new BufferedReader(
                                    new InputStreamReader(
                                        connection.getInputStream()));

            String header = connection.getHeaderField(0);
            System.out.println(header);
            System.out.println("---Start of headers---");
            int i = 1;
            while ((header = connection.getHeaderField(i)) != null) {
                String key = connection.getHeaderFieldKey(i);
                System.out.println(((key==null) ? "" : key + ": ") + header);
                i++;
            }
            System.out.println(connection.getHeaderField("http.agent"));
            System.out.println("---End of headers---");
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return in;
    }

我得到的是User-Agent null:

null
HTTP / 1.0 200 OK
---标题的开头---
服务器:Apache
缓存控制:max-age = 10
到期日:2011年8月7日星期日格林威治标准时间16:09:26 变化:接受编码
内容类型:text / html
内容长度:163582
日期:太阳,2011年8月7日16:09:20 GMT
X-Varnish:889692780 889684459
年龄:4
连接:保持活力
X-Bip:889692780 70 148
通过:1.1 CachOS
null
---标题结束---

为什么我不能设置User-Agent?

3 个答案:

答案 0 :(得分:3)

使用setHeader(),而不是setRequestProperty。

答案 1 :(得分:1)

设置系统属性:“http.agent”将更改您的连接标头:“User-Agent”,但请注意您的java版本仍在其中according to documentation

  

其他HTTP属性

     

http.agent(默认:“Java /”)       定义http请求中User-Agent请求标头中发送的字符串。

     

请注意,字符串“Java /”将附加到属性中提供的字符串(例如,如果使用-Dhttp.agent =“foobar”,则User-Agent标头将包含“foobar Java / 1.5.0”如果VM的版本是1.5.0)。此属性仅在启动时检查一次。

请注意,在启动时只检查一次属性,因此您可能需要首先设置属性,而不是创建第一个URL并进行连接。

要验证是否已发送相应的标头,您可以使用“tcpdump”。用法:

tcpdump -n dst host stackoverflow.com -vvvv

答案 2 :(得分:0)

服务器返回标头信息。我猜“用户代理”并不重要,无法返回。仅仅因为它没有被退回并不意味着它没有被发送。

我有一个显示标题信息的小工具(ieHTTPHeader)。当我在此页面上刷新时,它会发送并返回第一组标题:

GET / questions / 6973981 / why-cant-i-set-java-http-user-agent HTTP / 1.1
接受: /
推荐人:https://stackoverflow.com/questions/tagged/java?page=2&sort=newest&pagesize=15
接受语言:en-ca
用户代理:Mozilla / 4.0(兼容; MSIE 8.0; Windows NT 5.1; Trident / 4.0)
Accept-Encoding:gzip,deflate
主持人:stackoverflow.com
连接:保持活力
Cookie:__ utmc = 140029553; __utma = 140029553.1370458634.1310761265.1312727448.1312739618.123; __utmz = 140029553.1312739618.123.123.utmcsr =谷歌| utmccn =(有机)| utmcmd =有机| utmctr =雅虎%20finance%20api%20java; __qca = P0-1025379872-1310761265343; M = 4; USR = T = cEyCYO7bXECF&安培; S = X6DJTj5kuY8H; __utmb = 140029553.15.10.1312739618

HTTP / 1.1 200 OK
缓存控制:public,max-age = 60
内容类型:text / html;字符集= UTF-8
内容编码:gzip
到期日:2011年8月7日星期日18:25:43 GMT
最后修改日期:2011年8月7日星期日18:24:43 GMT 变化:*
日期:太阳,2011年8月7日18:24:42 GMT
内容长度:12040