【问题标题】:Java Servlets - How do I detect if a user is from a mobile device?Java Servlets - 如何检测用户是否来自移动设备?
【发布时间】:2011-02-12 00:53:35
【问题描述】:
Java Servlets - 我如何检测用户是否来自移动设备?
我正在使用 TinyMCE javascript 编辑器,但它在 iphone 上不起作用。如何检测用户是否来自移动设备?
【问题讨论】:
标签:
java
javascript
servlets
mobile
【解决方案1】:
我使用了 UAgentInfo.java 类,您可以在此处下载 (http://code.google.com/p/mobileesp/source/browse/Java/UAgentInfo.java):
private boolean isRequestComingFromAMobileDevice(final HttpServletRequest request){
// http://www.hand-interactive.com/m/resources/detect-mobile-java.htm
final String userAgent = request.getHeader("User-Agent");
final String httpAccept = request.getHeader("Accept");
final UAgentInfo detector = new UAgentInfo(userAgent, httpAccept);
return detector.detectMobileQuick();
}
UAgentInfo 类也有很多方法来检测特定设备。只需将 detector.detectMobileQuick() 替换为例如 detector.detectIphoneOrIpod()、detector.detectKindle() 等。
更新:如果您使用 Spring,您可能希望使用其本机实现。这是一个例子:http://spring.io/guides/gs/device-detection/
【解决方案2】:
使用request.getHeader("User-Agent")。 Here 是移动浏览器及其各自用户代理的列表。
【解决方案3】:
我正在使用 TinyMCE javascript 编辑器
由于您希望根据客户端更改客户端行为,因此最好在客户端而不是服务器端进行处理。
在 CSS 世界中,您可以挂钩 media type 以根据所使用的媒体应用样式。最常用的媒体类型是屏幕(通常是 PC)、手持(通常是手机)和打印(用于打印页面)。
您可以使用它来隐藏您的 CSS 中的以下规则:
@media handheld {
#elementIdContainingEditor { display: none; }
}
您甚至可以根据使用的媒体指定单独的样式表。
<link rel="stylesheet" href="default.css" media="screen">
<link rel="stylesheet" href="mobile.css" media="handheld">
如果问题实际上更多是因为 JavaScript 在特定客户端上被禁用而无法正常工作,那么您最好在 JS 被禁用时执行特定的 CSS:
<noscript><style>#elementIdContainingEditor { display: none; }</style></noscript>
或者反过来,先隐藏,然后在启用 JS 时显示:
<script>document.getElementById('elementIdContainingEditor').style.display = 'block';</script>
这比在服务器端嗅探代理更可靠。
【解决方案4】:
唯一不同的是用户代理。查找要检测的浏览器的用户代理。 (不知道你为什么会关心)
你也可以添加一些 javascript 在浏览器上运行一些东西?
【解决方案5】:
在 HTTP 请求标头中使用 User-Agent。
request.getHeader("User-Agent")
【解决方案6】:
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
if(request.getHeader("User-Agent").indexOf("Mobi") != -1) {
} else {
}
}