Java 如何获取操作系统和浏览器等客户端信息
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1326928/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How can I get client information such as OS and browser
提问by
I'm using JSP, Servlet to develop my web application.
我正在使用 JSP、Servlet 来开发我的 Web 应用程序。
I want to get client information such as: operation system, browser, resolution, ... whenever a client is using my website.
我想在客户使用我的网站时获取客户信息,例如:操作系统、浏览器、分辨率等。
回答by Aaron Digulla
The browser sends this information in the HTTP header. See the snoop exampleof Tomcat for some code (source, online demo).
浏览器在 HTTP 标头中发送此信息。部分代码见Tomcat的snoop 示例(源代码,在线演示)。
Note that this information is not reliable. Browser can and do lie about who they are and what OS they run on.
请注意,此信息不可靠。浏览器可以并且确实会在他们是谁以及他们运行的操作系统上撒谎。
回答by ZZ Coder
Your best bet is User-Agent header. You can get it like this in JSP or Servlet,
您最好的选择是 User-Agent 标头。你可以在 JSP 或 Servlet 中得到它,
String userAgent = request.getHeader("User-Agent");
The header looks like this,
标题看起来像这样,
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
It provides detailed information on browser. However, it's pretty much free format so it's very hard to decipher every single one. You just need to figure out which browsers you will support and write parser for each one. When you try to identify the version of browser, always check newer version first. For example, IE6 user-agent may contain IE5 for backward compatibility. If you check IE5 first, IE6 will be categorized as IE5 also.
它提供有关浏览器的详细信息。然而,它几乎是免费的格式,所以很难破译每一个。您只需要弄清楚您将支持哪些浏览器并为每个浏览器编写解析器。当您尝试识别浏览器的版本时,请务必先检查较新的版本。例如,IE6 用户代理可能包含 IE5 以实现向后兼容性。如果您先检查 IE5,则 IE6 也会被归类为 IE5。
You can get a full list of all user-agent values from this web site,
您可以从此网站获取所有用户代理值的完整列表,
With User-Agent, you can tell the exact version of the browser. You can get a pretty good idea on OS but you may not be able to distinguish between different versions of the same OS, for example, Windows NT and 2000 may use same User-Agent.
使用 User-Agent,您可以知道浏览器的确切版本。您可以在 OS 上获得一个不错的主意,但您可能无法区分同一 OS 的不同版本,例如,Windows NT 和 2000 可能使用相同的 User-Agent。
There is nothing about resolution. However, you can get this with Javascript on an AJAX call.
与分辨率无关。但是,您可以在 AJAX 调用中使用 Javascript 获得此功能。
回答by lambodar
In Java there is no direct way to get browser and OS related information.
在 Java 中,没有直接获取浏览器和操作系统相关信息的方法。
But to get this few third-party tools are available.
但是要获得这几个第三方工具是可用的。
Instead of trusting third-party tools, I suggest you to parsethe user agent.
相反,信任的第三方工具,我建议你分析的用户代理。
String browserDetails = request.getHeader("User-Agent");
By doing this you can separate the browser details and OS related information easily according to your requirement. PFB the snippet for reference.
通过这样做,您可以根据您的要求轻松地分离浏览器详细信息和操作系统相关信息。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);
回答by Denisa
You can use the bitwalker useragentutils library: https://github.com/HaraldWalker/user-agent-utils. It will provide you information about the Browser (name, type, version, manufacturer, etc.) and about the OperatingSystem. A good thing about it is that it is maintained. Access the link that I have provided to see the Maven dependency that you need to add to you project in order to use it.
您可以使用 bitwalker useragentutils 库:https: //github.com/HaraldWalker/user-agent-utils。它将为您提供有关浏览器(名称、类型、版本、制造商等)和操作系统的信息。关于它的一个好处是它得到了维护。访问我提供的链接以查看您需要添加到项目中以使用它的 Maven 依赖项。
See below sample code that returns the browser name and browser version.
请参阅以下返回浏览器名称和浏览器版本的示例代码。
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);
回答by Vishal Somaiya
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];
}
回答by Raedwald
You cannot reliably get this information. The basis of several answers provided here is to examine the User-Agent header of the HTTP request. However, there is no way to know if the information in the User-Agent header is truthful. The client sending the request can write anything in that header. So its content can be spoofed, or not sent at all.
您无法可靠地获取此信息。此处提供的几个答案的基础是检查 HTTP 请求的 User-Agent 标头。但是,无法知道 User-Agent 标头中的信息是否真实。发送请求的客户端可以在该标头中写入任何内容。所以它的内容可以被欺骗,或者根本不发送。
回答by tworec
There are two not bad libs for parsing user agent strings:
解析用户代理字符串有两个不错的库:
- user-agent-utils- java only, reached end-of-life
- ua-parser- multilanguage, archived
- ua-parser- java implementation of above, actively maintained
- user-agent-utils- 仅限 Java,已终止
- ua-parser- 多语言,存档
- ua-parser- 上面的 java 实现,积极维护
回答by Tk421
This code is based on the most voted question but I might be easier to use
此代码基于投票最多的问题,但我可能更容易使用
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;
}
}
回答by BobC
Here's my code that works, as of today, with some of the latest browsers.
这是我的代码,截至今天,适用于一些最新的浏览器。
Naturally, it will break as User-Agent's evolve, but it's simple, and easy to fix.
自然,它会随着 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
);
Logger Output:
记录器输出:
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
回答by Chetna Joshi
You can use browscap-javato get browser's information.
您可以使用browscap-java来获取浏览器的信息。
For Example:
例如:
UserAgentParser parser = new UserAgentService().loadParser(Arrays.asList(BrowsCapField.BROWSER));
Capabilities capabilities = parser.parse(user_agent);
String browser = capabilities.getBrowser();