为什么可以';设置Java http用户代理吗?

为什么可以';设置Java http用户代理吗?,java,networking,user-agent,httpurlconnection,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(); Sy

我尝试如下设置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;
    }
我得到的是用户代理null:


HTTP/1.0 200正常
---标题的开头--
服务器:Apache
缓存控制:最大年龄=10
过期时间:2011年8月7日星期日16:09:26 GMT
变化:接受编码
内容类型:text/html
内容长度:163582
日期:2011年8月7日星期日格林尼治标准时间16:09:20
X-清漆:889692780 889684459
年龄:4岁
连接:保持活动状态
X-Bip:889692780 70 148
Via:1.1cachos

---标题结尾---


为什么不能设置用户代理?

使用setHeader(),而不是setRequestProperty。

使用setHeader(),而不是setRequestProperty。

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

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

GET/questions/6973981/why-cant-i-set-java-http-user-agent http/1.1
接受:/
推荐人:
接受语言:en-ca
用户代理:Mozilla/4.0(兼容;MSIE 8.0;Windows NT 5.1;Trident/4.0)
接受编码:gzip,放气
主机:stackoverflow.com
连接:保持活动状态
Cookie:uuUTMC=140029553__utma=140029553.1370458634.1310761265.1312727448.1312739618.123__utmz=140029553.1312739618.123.123.utmcsr=google | UTMCN=(有机)| utmcmd=organic | utmctr=yahoo%20finance%20api%20java__qca=P0-1025379872-1310761265343;m=4;usr=t=cEyCYO7bXECF&s=X6DJTj5kuY8H__utmb=140029553.15.10.1312739618

HTTP/1.1200正常
缓存控制:公共,最大年龄=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

服务器返回标题信息。我猜“用户代理”还不够重要,不能返回。它没有被退回并不意味着它没有被发送

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

GET/questions/6973981/why-cant-i-set-java-http-user-agent http/1.1
接受:/
推荐人:
接受语言:en-ca
用户代理:Mozilla/4.0(兼容;MSIE 8.0;Windows NT 5.1;Trident/4.0)
接受编码:gzip,放气
主机:stackoverflow.com
连接:保持活动状态
Cookie:uuUTMC=140029553__utma=140029553.1370458634.1310761265.1312727448.1312739618.123__utmz=140029553.1312739618.123.123.utmcsr=google | UTMCN=(有机)| utmcmd=organic | utmctr=yahoo%20finance%20api%20java__qca=P0-1025379872-1310761265343;m=4;usr=t=cEyCYO7bXECF&s=X6DJTj5kuY8H__utmb=140029553.15.10.1312739618

HTTP/1.1200正常
缓存控制:公共,最大年龄=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

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

杂项HTTP属性

http.agent(默认值:“Java/”) 定义http请求中用户代理请求标头中发送的字符串

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

请注意,属性在启动时只检查一次,所以您可能希望首先设置属性,然后创建第一个url并连接

要验证是否发送了适当的标头,可以使用“”。用法:

设置系统属性:“http.agent”将更改您的连接头:“User agent”,但请注意,您的java版本仍然写入其中:

杂项HTTP属性

http.agent(默认值:“Java/”) 定义http请求中用户代理请求标头中发送的字符串

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

请注意,属性在启动时只检查一次,所以您可能希望首先设置属性,然后创建第一个url并连接

要验证是否发送了适当的标头,可以使用“”。用法:


对不起,我从哪里得到这个setHeader()?我正在使用URLConnection类。很抱歉,我从哪里得到这个setHeader()?我使用的是URLConnection类。可能是我尝试过的另一个主题的副本,但没有任何效果。我使用JDK1.6Update24。可能是我尝试过的另一个主题的副本,但是没有任何效果。我使用JDK1.6Update24。谢谢您的回答,但是什么是代理的正确字符串?“http.agent”还是“用户代理”?我知道了。。非常感谢。但在这种情况下,我要设置标题。。我不应该看吗?我尝试了其他网站的网址和所有相同的。。将用户代理显示为空。您是否阅读了我的响应???我已经说过,我认为你不应该看到用户代理。我甚至在使用IE时给了你们标题的输出。你们还想要什么?是的,我读到了。。但发出请求的人不是我?设置请求标题的人不是我?对不起,也许这是个新手问题,但我想知道你的答案。致以最诚挚的问候。我将尝试使用Apache http:-/谢谢你的回答,但是正确的字符串是什么
tcpdump -n dst host stackoverflow.com -vvvv