如何获取操作系统和浏览器等客户端信息

时间:2009-08-25 08:50:10

标签: java servlets

我正在使用JSP,Servlet来开发我的Web应用程序。

我希望在客户端使用我的网站时获取客户信息,例如:操作系统,浏览器,分辨率......

10 个答案:

答案 0 :(得分:55)

您最好的选择是User-Agent标头。你可以在JSP或Servlet中这样得到它,

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

标题看起来像这样,

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

它提供有关浏览器的详细信息。然而,它几乎是免费的格式,因此很难解读每一个。您只需要弄清楚您将支持哪些浏览器并为每个浏览器编写解析器。当您尝试识别浏览器的版本时,请始终先检查更新的版本。例如,IE6用户代理可能包含IE5以实现向后兼容。如果先检查IE5,IE6也将被归类为IE5。

您可以从此网站获取所有用户代理值的完整列表,

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

使用User-Agent,您可以确定浏览器的确切版本。您可以在操作系统上获得一个非常好的想法,但您可能无法区分同一操作系统的不同版本,例如,Windows NT和2000可能使用相同的用户代理。

决议没有任何意义。但是,您可以在AJAX调用中使用Javascript来获取此信息。

答案 1 :(得分:50)

在Java中,没有直接获取浏览器和操作系统相关信息的方法。

但是要获得这些少数第三方工具。

我建议您解析 用户代理,而不是信任第三方工具。

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

通过这样做,您可以根据您的要求轻松分离浏览器详细信息和操作系统相关信息。 PFB该片段供参考。

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

答案 2 :(得分:13)

您可以使用bitwalker useragentutils库:https://github.com/HaraldWalker/user-agent-utils。它将为您提供有关浏览器(名称,类型,版本,制造商等)和操作系统的信息。它的一个好处是它得到维护。访问我提供的链接,以查看您需要添加到项目中的Maven依赖项以便使用它。

请参阅以下示例代码,该代码返回浏览器名称和浏览器版本。

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

答案 3 :(得分:6)

浏览器在HTTP标头中发送此信息。有关一些代码(snoop examplesource),请参阅Tomcat的online demo

请注意,此信息不可靠。浏览器可以而且可以确定他们是谁以及他们运行的操作系统。

答案 4 :(得分:5)

解析用户代理字符串有两个不错的库:

答案 5 :(得分:3)

您可以使用browscap-java来获取浏览器的信息。

例如:

<html>
<meta charset="UTF-8">
<title>
    Snake Game
</title>
<link href="https://fonts.googleapis.com/css?family=Sniglet&display=swap" rel="stylesheet">
<style>
    * {
        padding: 0px;
        margin: 0px;
    }

    #canvas {
        background-color: #8BAC0F;
        -webkit-box-shadow: 10px 10px 5px 0px rgba(0, 0, 0, 0.75);
        -moz-box-shadow: 10px 10px 5px 0px rgba(0, 0, 0, 0.75);
        box-shadow: 10px 10px 5px 0px rgba(0, 0, 0, 0.75);
    }

    #snakeGroup {
        text-align: center;
    }

    #snakeTitle {
        font-family: 'Sniglet', cursive;
        font-size: 80px;
        margin-top: 40px;
        margin-bottom: 20px;
    }

    #snakePara {
        font-family: 'Sniglet', cursive;
        font-size: 20px;
        margin-bottom: 20px;
    }

    #gameover {
        font-family: 'Sniglet', cursive;
        font-size: 50px;
        margin-bottom: 15px;
    }

    #footerText {
        font-family: 'Sniglet', cursive;
        font-size: 35px;
        margin-top: 25px;
    }
</style>

<body onkeypress="window.onload">
    <div id="snakeGroup">
        <h1 id="snakeTitle">Snake ?</h1>
        <p id="snakePara">Press the arrow keys ⬅️⬆️⬇️➡️ to move the snake.<br> Eat the food to score points. If the
            snake touches the walls
            or itself, its game over.<br> The game will automatically restart after 3 seconds. Happy Gaming!</p>
        <h2 id="gameover">Score: <span id="gameScore"></span></h2>
        <canvas id="canvas" width="500px" height="500px"></canvas>
        <h3 id="footerText">Made with ❤️ by David Winters</h3>
    </div>

    <script src="snake.js"></script>
</body>

</html>

答案 6 :(得分:0)

您无法可靠地获取此信息。这里提供的几个答案的基础是检查HTTP请求的User-Agent标头。但是,无法知道User-Agent标头中的信息是否真实。发送请求的客户端可以在该标头中写入任何内容。所以它的内容可能是欺骗性的,或者根本不发送。

答案 7 :(得分:0)

此代码基于投票最多的问题,但我可能会更易于使用

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

}

答案 8 :(得分:0)

从今天开始,这是我的代码,现在可以与某些最新的浏览器一起使用。

很自然地,它会随着User-Agent的发展而破裂,但它很简单,而且易于修复。

    String userAgent = "Unknown";
    String osType = "Unknown";
    String osVersion = "Unknown";
    String browserType = "Unknown";
    String browserVersion = "Unknown";
    String deviceType = "Unknown";

    try {
        userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36 OPR/60.0.3255.165";
        //userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0";
        //userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36";
        //userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134";
        //userAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.1 Mobile/15E148 Safari/604.1";
        boolean exceptionTest = false;
        if(exceptionTest) throw new Exception("EXCEPTION TEST");

        if (userAgent.indexOf("Windows NT") >= 0) {
            osType = "Windows";
            osVersion = userAgent.substring(userAgent.indexOf("Windows NT ")+11, userAgent.indexOf(";"));

        } else if (userAgent.indexOf("Mac OS") >= 0) {
            osType = "Mac";
            osVersion = userAgent.substring(userAgent.indexOf("Mac OS ")+7, userAgent.indexOf(")"));

            if(userAgent.indexOf("iPhone") >= 0) {
                deviceType = "iPhone";
            } else if(userAgent.indexOf("iPad") >= 0) {
                deviceType = "iPad";
            }

        } else if (userAgent.indexOf("X11") >= 0) {
            osType = "Unix";
            osVersion = "Unknown";

        } else if (userAgent.indexOf("android") >= 0) {
            osType = "Android";
            osVersion = "Unknown";
        }
        logger.trace("end of os section");

        if (userAgent.contains("Edge/")) {
            browserType = "Edge";
            browserVersion = userAgent.substring(userAgent.indexOf("Edge")).split("/")[1];

        } else if (userAgent.contains("Safari/") && userAgent.contains("Version/")) {
            browserType = "Safari";
            browserVersion = userAgent.substring(userAgent.indexOf("Version/")+8).split(" ")[0];

        } else if (userAgent.contains("OPR/") || userAgent.contains("Opera/")) {
            browserType = "Opera";
            browserVersion = userAgent.substring(userAgent.indexOf("OPR")).split("/")[1];

        } else if (userAgent.contains("Chrome/")) {
            browserType = "Chrome"; 
            browserVersion = userAgent.substring(userAgent.indexOf("Chrome")).split("/")[1];
            browserVersion = browserVersion.split(" ")[0];

        } else if (userAgent.contains("Firefox/")) {
            browserType = "Firefox"; 
            browserVersion = userAgent.substring(userAgent.indexOf("Firefox")).split("/")[1];
        }            
        logger.trace("end of browser section");

    } catch (Exception ex) {
        logger.error("ERROR: " +ex);            
    }

    logger.debug(
              "\n userAgent: " + userAgent
            + "\n osType: " + osType
            + "\n osVersion: " + osVersion
            + "\n browserType: " + browserType
            + "\n browserVersion: " + browserVersion
            + "\n deviceType: " + deviceType
            );

记录器输出:

 userAgent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36 OPR/60.0.3255.165
 osType: Windows
 osVersion: 10.0
 browserType: Opera
 browserVersion: 60.0.3255.165
 deviceType: Unknown

答案 9 :(得分:-1)

else if(user.contains("rv:11.0"))
            {
                String substring=userAgent.substring(userAgent.indexOf("rv")).split("\\)")[0];
                browser=substring.split(":")[0].replace("rv", "IE")+"-"+substring.split(":")[1];

            }