Настройка агента пользователя Java URLConnection

Я пытаюсь проанализировать веб-страницу с помощью Java с URLConnection. Я пытаюсь настроить user-agent следующим образом:

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", добавленным к концу. Есть ли способ действительно установить агент пользователя без этого добавления?

5 ответов


Off hand, установка http.agent системное свойство, чтобы "" может сделать трюк (у меня нет кода передо мной).

вам может сойти с рук:

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

но это может потребовать гонки между вами и инициализации обработчика протокола URL, если он кэширует значение при запуске (на самом деле, я не думаю, что это так).

свойство также может быть установлено через файлы JNLP (доступные для апплетов из 6u10) и по команде строка:

-Dhttp.agent=

или для команд оболочки:

-J-Dhttp.agent=

просто для уточнения: setRequestProperty работает просто отлично! По крайней мере с Java 1.6.30.

Я слушал на своей машине с netcat (прослушиватель портов):

$ nc -l -p 8080

Он просто слушает порт, поэтому вы видите все, что запрашивается, например необработанные http-заголовки.

и получил следующие http-заголовки без setRequestProperty:

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


его работа для меня задайте агент пользователя в addRequestProperty.

URL url = new URL(<URL>);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
httpConn.addRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0");

http-серверы, как правило, отклоняют старые браузеры и системы.

страница Tech Blog (wh): наиболее распространенные пользовательские агенты отражает свойство user-agent вашего текущего браузера в разделе " ваш пользовательский агент:", который может быть применен для установки свойства запроса "User-Agent"java.net.URLConnection или системное свойство "http.агент."