web-dev-qa-db-fra.com

Comment puis-je obtenir des informations client telles que le système d'exploitation et le navigateur?

J'utilise JSP, Servlet pour développer mon application Web.

Je souhaite obtenir des informations client telles que: système d'exploitation, navigateur, résolution, ... chaque fois qu'un client utilise mon site Web.

51
Chan Tee

Votre meilleur pari est l’en-tête User-Agent. Vous pouvez l'obtenir comme ceci dans JSP ou Servlet,

String userAgent = request.getHeader("User-Agent");

L'en-tête ressemble à ceci,

User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.13) Gecko/2009073021 Firefox/3.0.13

Il fournit des informations détaillées sur le navigateur. Cependant, il s'agit plutôt d'un format libre, il est donc très difficile de déchiffrer chacun d'entre eux. Vous devez juste déterminer quels navigateurs vous allez supporter et écrire un analyseur pour chacun. Lorsque vous essayez d'identifier la version du navigateur, commencez toujours par vérifier la version la plus récente. Par exemple, l'agent utilisateur IE6 peut contenir IE5 pour des raisons de compatibilité ascendante. Si vous vérifiez d'abord IE5, IE6 sera également classé dans la catégorie IE5.

Vous pouvez obtenir la liste complète de toutes les valeurs d’agent d’utilisateur sur ce site Web,

http://www.user-agents.org/

Avec User-Agent, vous pouvez connaître la version exacte du navigateur. Vous pouvez avoir une assez bonne idée sur le système d'exploitation, mais vous ne pourrez peut-être pas distinguer les différentes versions du même système d'exploitation. Par exemple, Windows NT et 2000 peuvent utiliser le même agent utilisateur.

Il n'y a rien sur la résolution. Cependant, vous pouvez l'obtenir avec Javascript sur un appel AJAX.

55
ZZ Coder

En Java, il n’existe aucun moyen direct d’obtenir des informations relatives au navigateur et au système d’exploitation.

Mais pour obtenir ces quelques outils tiers sont disponibles.

Au lieu de faire confiance aux outils tiers, je vous suggère de parse l'agent user.

String  browserDetails  =   request.getHeader("User-Agent");

En faisant cela, vous pouvez facilement séparer les détails du navigateur et les informations relatives au système d'exploitation en fonction de vos besoins. PFB l'extrait de code pour référence. 

        String  browserDetails  =   request.getHeader("User-Agent");
        String  userAgent       =   browserDetails;
        String  user            =   userAgent.toLowerCase();

        String os = "";
        String browser = "";

        log.info("User Agent for the request is===>"+browserDetails);
        //=================OS=======================
         if (userAgent.toLowerCase().indexOf("windows") >= 0 )
         {
             os = "Windows";
         } else if(userAgent.toLowerCase().indexOf("mac") >= 0)
         {
             os = "Mac";
         } else if(userAgent.toLowerCase().indexOf("x11") >= 0)
         {
             os = "Unix";
         } else if(userAgent.toLowerCase().indexOf("Android") >= 0)
         {
             os = "Android";
         } else if(userAgent.toLowerCase().indexOf("iphone") >= 0)
         {
             os = "IPhone";
         }else{
             os = "UnKnown, More-Info: "+userAgent;
         }
         //===============Browser===========================
        if (user.contains("msie"))
        {
            String substring=userAgent.substring(userAgent.indexOf("MSIE")).split(";")[0];
            browser=substring.split(" ")[0].replace("MSIE", "IE")+"-"+substring.split(" ")[1];
        } else if (user.contains("safari") && user.contains("version"))
        {
            browser=(userAgent.substring(userAgent.indexOf("Safari")).split(" ")[0]).split("/")[0]+"-"+(userAgent.substring(userAgent.indexOf("Version")).split(" ")[0]).split("/")[1];
        } else if ( user.contains("opr") || user.contains("opera"))
        {
            if(user.contains("opera"))
                browser=(userAgent.substring(userAgent.indexOf("Opera")).split(" ")[0]).split("/")[0]+"-"+(userAgent.substring(userAgent.indexOf("Version")).split(" ")[0]).split("/")[1];
            else if(user.contains("opr"))
                browser=((userAgent.substring(userAgent.indexOf("OPR")).split(" ")[0]).replace("/", "-")).replace("OPR", "Opera");
        } else if (user.contains("chrome"))
        {
            browser=(userAgent.substring(userAgent.indexOf("Chrome")).split(" ")[0]).replace("/", "-");
        } else if ((user.indexOf("mozilla/7.0") > -1) || (user.indexOf("netscape6") != -1)  || (user.indexOf("mozilla/4.7") != -1) || (user.indexOf("mozilla/4.78") != -1) || (user.indexOf("mozilla/4.08") != -1) || (user.indexOf("mozilla/3") != -1) )
        {
            //browser=(userAgent.substring(userAgent.indexOf("MSIE")).split(" ")[0]).replace("/", "-");
            browser = "Netscape-?";

        } else if (user.contains("firefox"))
        {
            browser=(userAgent.substring(userAgent.indexOf("Firefox")).split(" ")[0]).replace("/", "-");
        } else if(user.contains("rv"))
        {
            browser="IE-" + user.substring(user.indexOf("rv") + 3, user.indexOf(")"));
        } else
        {
            browser = "UnKnown, More-Info: "+userAgent;
        }
        log.info("Operating System======>"+os);
        log.info("Browser Name==========>"+browser);
47
lambodar

Vous pouvez utiliser la bibliothèque bitwalker useragentutils: https://github.com/HaraldWalker/user-agent-utils . Il vous fournira des informations sur le navigateur (nom, type, version, fabricant, etc.) et sur OperatingSystem. Une bonne chose à ce sujet est qu'il est maintenu. Accédez au lien que j'ai fourni pour voir la dépendance Maven que vous devez ajouter à votre projet pour pouvoir l'utiliser.

Voir ci-dessous un exemple de code qui renvoie le nom et la version du navigateur.

    UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"));
    Browser browser = userAgent.getBrowser();

    String browserName = browser.getName();
    //or 
    // String browserName = browser.getGroup().getName();
    Version browserVersion = userAgent.getBrowserVersion();
    System.out.println("The user is using browser " + browserName + " - version " + browserVersion);
12
Denisa

Le navigateur envoie ces informations dans l'en-tête HTTP. Voir l’exemple snoop de Tomcat pour du code ( source , démo en ligne ).

Notez que cette information n'est pas fiable. Le navigateur peut mentir sur son identité et sur le système d'exploitation sur lequel il tourne.

6
Aaron Digulla

Il existe deux bibliothèques pas mal pour analyser les chaînes de l'agent utilisateur:

4
tworec

Ce code est basé sur la question la plus votée mais je pourrais être plus facile à utiliser

public enum OS {

    WINDOWS,
    MAC,
    LINUX,
    Android,
    IPHONE,
    UNKNOWN;

    public static OS valueOf(HttpServletRequest request) {

        final String userAgent = request.getHeader("User-Agent");
        final OS toReturn;

        if (userAgent == null || userAgent.isEmpty()) {
            toReturn = UNKNOWN;
        } else if (userAgent.toLowerCase().contains("windows")) {
            toReturn = WINDOWS;
        } else if (userAgent.toLowerCase().contains("mac")) {
            toReturn = MAC;
        } else if (userAgent.toLowerCase().contains("x11")) {
            toReturn = LINUX;
        } else if (userAgent.toLowerCase().contains("Android")) {
            toReturn = Android;
        } else if (userAgent.toLowerCase().contains("iphone")) {
            toReturn = IPHONE;
        } else {
            toReturn = UNKNOWN;
        }

        return toReturn;
    }

}
0
Tk421

Vous ne pouvez pas obtenir cette information de manière fiable. La base de plusieurs réponses fournies ici est d'examiner l'en-tête User-Agent de la requête HTTP. Cependant, il n'y a aucun moyen de savoir si les informations contenues dans l'en-tête User-Agent sont véridiques. Le client qui envoie la demande peut écrire n'importe quoi dans cet en-tête. Ainsi, son contenu peut être usurpé ou pas du tout envoyé.

0
Raedwald