在 Web 应用程序中检测设备类型

Posted

技术标签:

【中文标题】在 Web 应用程序中检测设备类型【英文标题】:Detecting Device Type in a web application 【发布时间】:2012-01-20 20:35:29 【问题描述】:

我们有一个基于 Java 的应用程序,我们希望在其中检测发送请求的设备的设备类型(移动设备或桌面设备)。

这怎么可能?

【问题讨论】:

查看重复的问题和答案:***.com/questions/1005153/… 概念完全一样。你检查用户代理。 【参考方案1】:

您必须从请求中读取 User-Agent 标头并做出决定。

在普通 servlet 应用程序中,一种粗略的做法是:

public void doGet(HttpServletRequest request,
                HttpServletResponse response) throws ServletException, IOException 
  if(request.getHeader("User-Agent").contains("Mobi")) 
    //you're in mobile land
   else 
    //nope, this is probably a desktop
  

【讨论】:

Mozilla 网站上最新更好的方法 - developer.mozilla.org/en-US/docs/… 另一种详尽的方式 - code.google.com/p/mobileesp/source/browse/Java/UAgentInfo.java 另一个不错的库是 bitwalker useragentutils:github.com/HaraldWalker/user-agent-utils,它提供了 BrowserType、DeviceType、OperatingSystem、Manufacturer、Version 的枚举。它可以通过 Maven 安装,并且(也许是最重要的)得到维护。 根据 Mozilla:“总而言之,我们建议在用户代理中的任何位置查找字符串“Mobi”以检测移动设备。”参考:developer.mozilla.org/en-US/docs/Web/HTTP/…【参考方案2】:

可以通过解析http header获取设备信息

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

你应该解析 browserType 来获取设备类型

这可能会有所帮助

  public String  getBrowserInfo( String Information )
  
    String browsername = "";
    String browserversion = "";
    String browser = Information;
    if (browser.contains("MSIE"))
    
      String subsString = browser.substring(browser.indexOf("MSIE"));
      String info[] = (subsString.split(";")[0]).split(" ");
      browsername = info[0];
      browserversion = info[1];
     else if (browser.contains("Firefox"))
    

      String subsString = browser.substring(browser.indexOf("Firefox"));
      String info[] = (subsString.split(" ")[0]).split("/");
      browsername = info[0];
      browserversion = info[1];
     else if (browser.contains("Chrome"))
    

      String subsString = browser.substring(browser.indexOf("Chrome"));
      String info[] = (subsString.split(" ")[0]).split("/");
      browsername = info[0];
      browserversion = info[1];
     else if (browser.contains("Opera"))
    

      String subsString = browser.substring(browser.indexOf("Opera"));
      String info[] = (subsString.split(" ")[0]).split("/");
      browsername = info[0];
      browserversion = info[1];
     else if (browser.contains("Safari"))
    

      String subsString = browser.substring(browser.indexOf("Safari"));
      String info[] = (subsString.split(" ")[0]).split("/");
      browsername = info[0];
      browserversion = info[1];
    
    return browsername + "-" + browserversion;
  

【讨论】:

你能提供更多关于这方面的信息吗?我试图通过Http Header提供的数据但没有找到所需的数据。 有人可以在向服务器发送请求时伪造User-Agent 吗?说他们点击了curl 命令,但假装它来自Mobile @daydreamer 可以更改或“伪造”您的网络浏览器作为其用户代理发送的内容。一些移动网络浏览器允许您更改浏览器的标识(即“移动模式”或“桌面模式”),以便访问某些只允许桌面计算机的网站。如果您更改此设置,用户代理就会受到影响。 有适用于 Chrome 和 Firefox 的插件,可能还有其他插件允许您编写任何用户代理,甚至是预定义的“ipad”和“searchbot”用户代理......不值得信任,但有利于统计【参考方案3】:

您可以获得第 3 方软件解决方案。那里有很多开源的。我之前使用过51Degrees.mobi's Java solution(并且还研究过他们的开源 C 解决方案)。按照该链接并点击下载按钮。启动和运行起来相对容易。

【讨论】:

【参考方案4】:

您可以尝试使用Spring Mobile。有一些方便的类可以解决这个问题。

Device currentDevice = DeviceUtils.getCurrentDevice(servletRequest);
if(currentDevice.isMobile())  /* Mobile */ 
if(currentDevice.isTablet())  /* Tablet */ 
if(currentDevice.isNormal())  /* Desktop */ 

【讨论】:

【参考方案5】:

你可以试试这个库,我想,yauaa 可以检测到用户代理字符串是哪个设备/软件

https://github.com/nielsbasjes/yauaa

【讨论】:

【参考方案6】:

您可以检查HttpServletRequest 对象上的User-Agent HTTP header。

参考:http://www.w3.org/Protocols/HTTP/HTRQ_Headers.html#user-agent

【讨论】:

我认为最好将重复链接放在问题本身的评论下方。现在它表明你的答案是重复的。【参考方案7】:

对于 Java 51Degrees 在 GitHub https://github.com/51Degrees/Java-Device-Detection 上有一个免费的 API,它定期没有注明日期,应该能够涵盖您需要的所有基本保留。

这里有一个如何使用API​​进行设备类型检测的教程https://51degrees.com/Developers/Documentation/APIs/Java-V32/Tutorials/Web-App

还有一个提供 DeviceType 属性的免费云版本(如果您想要的不仅仅是 IsMobile),您可以在 51Degrees 网站上找到有关此内容的详细信息。您需要通过网站“购买”免费云,但它不要求提供银行详细信息,并且完全免费。您还可以根据自己的要求使用 javascript 和其他集成。

披露:我在 51Degrees 工作。

【讨论】:

【参考方案8】:

还有http://openddr.mobi/,开源设备检测用于

Java C# VB.net

基于W3C Device Description Repository。

OpenDDR 可与 51Degrees、DeviceAtlas 或 ScientiaMobile/WURFL 的设备存储库相媲美,但与那些专有的封闭源代码产品不同,它是开源且免费使用的。

【讨论】:

以上是关于在 Web 应用程序中检测设备类型的主要内容,如果未能解决你的问题,请参考以下文章

使用 JavaScript 的 FileReader 接口检测文件的内容类型

适用于移动设备和 Web 的安全 API

如何检测我的 Flutter 应用程序是不是在 Web 中运行?

移动web开发之媒体查询

如何在 Web 应用程序中检测 tel: uri 方案的可用性?

web数据存储