在 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 接口检测文件的内容类型
如何检测我的 Flutter 应用程序是不是在 Web 中运行?