web-dev-qa-db-fra.com

Définition de l’agent utilisateur d’un Java URLConnection

J'essaie d'analyser une page Web à l'aide de Java avec URLConnection. J'essaie de configurer l'agent utilisateur de la manière suivante:

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");

Mais l'agent utilisateur obtenu est celui que je spécifie, avec "Java/1.5.0_19" ajouté à la fin. Existe-t-il un moyen de définir réellement l'agent utilisateur sans cet ajout?

72
DiglettPotato

La main gauche, régler le http.agent propriété système à "" _ pourrait faire l'affaire (je n'ai pas le code devant moi).

Vous pourriez vous en tirer avec:

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

mais cela peut nécessiter une course entre vous et l'initialisation du gestionnaire de protocole d'URL, s'il met en cache la valeur au démarrage (en fait, je ne le pense pas).

La propriété peut également être définie via les fichiers JNLP (disponibles pour les applets de 6 à 10) et sur la ligne de commande:

-Dhttp.agent=

Ou pour les commandes wrapper:

-J-Dhttp.agent=
60

Juste pour clarifier: setRequestProperty("User-Agent", "Mozilla ...") fonctionne maintenant correctement et n’ajoute pas Java/xx à la fin! Au moins avec Java 1.6.30.

J'ai écouté sur ma machine avec netcat (un port d'écoute):

$ nc -l -p 8080

Il écoute simplement sur le port, de sorte que vous voyez tout ce qui est demandé, comme les en-têtes http bruts.

Et obtenu les en-têtes http suivants sans 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

Et WITH 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

Comme vous pouvez le constater, l'agent utilisateur était correctement défini.

Exemple complet:

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());
    }

}
89
jens

Légèrement changé Tom Hawtins répondre à:

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

selon http://www.ivoa.net/forum/apps/0903/0610.htm

7
Karussell

son travail pour moi définissez le User-Agent dans 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");
3
Bachan Joseph

Les serveurs HTTP ont tendance à rejeter les anciens navigateurs et systèmes.

La page Blog technique (wh): agents utilisateur les plus courants reflète la propriété utilisateur-agent de votre navigateur actuel dans la section "Votre agent utilisateur est:" , qui peut être appliqué pour définir la propriété de requête "User-Agent" d'un Java.net.URLConnection ou la propriété système "http.agent".

1
Sam Ginrich