【问题标题】:How can I get client information such as OS and browser如何获取操作系统和浏览器等客户端信息
【发布时间】:2010-11-22 13:15:41
【问题描述】:

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

我想在客户使用我的网站时获取客户信息,例如:操作系统、浏览器、分辨率……。

【问题讨论】:

    标签: java servlets


    【解决方案1】:

    您最好的选择是 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 可能使用相同的 User-Agent。

    分辨率无关紧要。但是,您可以在 AJAX 调用中使用 Javascript 来获取此信息。

    【讨论】:

    • 还要注意,这些信息都不能被视为理所当然。用户代理可能根本不提供 User-Agent 标头或对其撒谎。这两种情况都很少见,但如果您依赖这些信息,则应牢记这一事实。
    • @JoachimSauer 你能告诉我用户代理可能不提供 User-Agent 标头或撒谎的情况吗?
    • @RAS:例如,Opera 允许用户选择它发送的用户代理(在不同的操作系统上模拟 Firefox、Chrome 或 IE)。 ChromeFirefox 以及其他所有浏览器都有一个扩展名。
    • @JoachimSauer 感谢您提供的信息,但我只是问,因为目前我正在处理同样的问题。我只使用火狐。这是问题的链接:stackoverflow.com/questions/17167491/…
    【解决方案2】:

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

    但是要获得这几个第三方工具可用。

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

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

    通过这样做,您可以根据您的要求轻松分离浏览器详细信息和操作系统相关信息。 PFB sn-p 供参考(您也可以将其替换为开关盒)。

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

    【讨论】:

    • 你也可以换成开关盒。
    • 您可以像这样为 Edge 添加额外的检查 - else if (user.contains("edge")) { browser = (userAgent.substring(userAgent.indexOf("Edge")).split (" ")[0]).replace("/", "-"); }
    • 错误的决定恕我直言。这就像编写自己的加密库一样。你最好不要。这太容易出错了。边缘呢?最近他们切换到基于铬的边缘,而 ua 只包含“边缘”。您必须不断更新您的代码。有太多您无法识别或错误识别的用户代理。首选积极维护的活动 ua 解析项目。结果会好很多。
    • @Lonzak 在更新部分同意您的意见,当您使用 3rd 方库时也是如此。在发布新的浏览器或操作系统时,您必须更新库并且魔法不会自动发生。与加密库相比是不公平的:)
    • 这是一个普遍的问题:自己写东西或使用库。在这种情况下,我显然会决定使用图书馆(这就是我的意思)。加密库只是一个例子。你也可以说编写自己的 XML 解析器——我也推荐)
    【解决方案3】:

    更新:该项目已停产,不再维护。他建议切换到Browscap project

    您可以使用 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);
    

    【讨论】:

    • 请注意。该库不再维护,并且在链接到的 github 页面上有“生命终止”通知。
    【解决方案4】:

    浏览器在 HTTP 标头中发送此信息。部分代码见Tomcat的snoop examplesourceonline demo)。

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        例如:

        UserAgentParser parser = new UserAgentService().loadParser(Arrays.asList(BrowsCapField.BROWSER));
            Capabilities capabilities = parser.parse(user_agent);
        
            String browser = capabilities.getBrowser();
        

        【讨论】:

          【解决方案7】:

          这是我的代码,截至今天,它适用于一些最新的浏览器。

          当然,它会随着 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
          

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              【解决方案9】:

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

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

              【讨论】:

                【解决方案10】:
                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];
                
                            }
                

                【讨论】:

                • 考虑为您的答案提供解释
                • 获取IE11信息。把这段代码和上面的例子放在一起。
                猜你喜欢
                • 1970-01-01
                • 2020-02-12
                • 2020-01-18
                • 2017-12-14
                • 1970-01-01
                • 2013-02-14
                • 2016-04-18
                • 2021-01-08
                • 1970-01-01
                相关资源
                最近更新 更多