【问题标题】:Why can't I set Java http User-Agent?为什么我不能设置 Java http User-Agent?
【发布时间】:2011-08-07 16:16:44
【问题描述】:

我尝试为 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:


HTTP/1.0 200 正常
---标题的开始---
服务器:阿帕奇
缓存控制:max-age=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
通过:1.1 CachOS

---标题结束---

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

【问题讨论】:

标签: java networking user-agent httpurlconnection


【解决方案1】:

使用 setHeader(),而不是 setRequestProperty。

【讨论】:

  • 对不起,我从哪里得到这个 setHeader() ?我正在使用 URLConnection 类。
【解决方案2】:

设置系统属性:“http.agent”会改变你的连接头:“User-Agent”,但是注意according to documentation你的java版本仍然写在里面:

其他 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

【讨论】:

    【解决方案3】:

    服务器返回头信息。我猜“用户代理”还不够重要,不能返回。没有退回不代表没有发送。

    我有一个显示标头信息的小工具(即HTTPHeader)。当我在此页面上进行刷新时,这是发送和返回的第一组标头:

    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)
    接受编码:gzip、deflate
    主机:stackoverflow.com
    连接:保持活动
    饼干:__utmc=140029553; __utma=140029553.1370458634.1310761265.1312727448.1312739618.123; __utmz=140029553.1312739618.123.123.utmcsr=google|utmccn=(有机)|utmcmd=有机|utmctr=yahoo%20finance%20api%20java; __qca=P0-1025379872-1310761265343; m=4; usr=t=cEyCYO7bXECF&s=X6DJTj5kuY8H; __utmb=140029553.15.10.1312739618

    HTTP/1.1 200 正常
    缓存控制:公共,最大年龄=60
    内容类型:文本/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”还是“用户代理”?
    • 我明白了.. 谢谢.. 但在这种情况下,我正在设置标题.. 我不应该看到吗?我尝试使用其他网站的 URL 并且都相同.. 将用户代理显示为 null。
    • 你看我的回复了吗???我已经说过我认为您不应该看到用户代理。我什至在使用 IE 时给了你标题的输出。你还想要什么?
    • 是的,我读过.. 但是发送请求的人不是我吗?谁设置的请求头不是我?对不起,也许这是一个新手问题,但我想得到你的回答。最好的问候。
    • 我将尝试使用 Apache http。 :-/
    猜你喜欢
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多