我正在使用JSP,Servlet来开发我的Web应用程序。
我希望在客户端使用我的网站时获取客户信息,例如:操作系统,浏览器,分辨率......
答案 0 :(得分:55)
您最好的选择是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。
您可以从此网站获取所有用户代理值的完整列表,
使用User-Agent,您可以确定浏览器的确切版本。您可以在操作系统上获得一个非常好的想法,但您可能无法区分同一操作系统的不同版本,例如,Windows NT和2000可能使用相同的用户代理。
决议没有任何意义。但是,您可以在AJAX调用中使用Javascript来获取此信息。
答案 1 :(得分:50)
在Java中,没有直接获取浏览器和操作系统相关信息的方法。
但是要获得这些少数第三方工具。
我建议您解析 用户代理,而不是信任第三方工具。
String browserDetails = request.getHeader("User-Agent");
通过这样做,您可以根据您的要求轻松分离浏览器详细信息和操作系统相关信息。 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);
答案 2 :(得分:13)
您可以使用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);
答案 3 :(得分:6)
浏览器在HTTP标头中发送此信息。有关一些代码(snoop example,source),请参阅Tomcat的online demo。
请注意,此信息不可靠。浏览器可以而且可以确定他们是谁以及他们运行的操作系统。
答案 4 :(得分:5)
解析用户代理字符串有两个不错的库:
答案 5 :(得分:3)
您可以使用browscap-java来获取浏览器的信息。
例如:
<html>
<meta charset="UTF-8">
<title>
Snake Game
</title>
<link href="https://fonts.googleapis.com/css?family=Sniglet&display=swap" rel="stylesheet">
<style>
* {
padding: 0px;
margin: 0px;
}
#canvas {
background-color: #8BAC0F;
-webkit-box-shadow: 10px 10px 5px 0px rgba(0, 0, 0, 0.75);
-moz-box-shadow: 10px 10px 5px 0px rgba(0, 0, 0, 0.75);
box-shadow: 10px 10px 5px 0px rgba(0, 0, 0, 0.75);
}
#snakeGroup {
text-align: center;
}
#snakeTitle {
font-family: 'Sniglet', cursive;
font-size: 80px;
margin-top: 40px;
margin-bottom: 20px;
}
#snakePara {
font-family: 'Sniglet', cursive;
font-size: 20px;
margin-bottom: 20px;
}
#gameover {
font-family: 'Sniglet', cursive;
font-size: 50px;
margin-bottom: 15px;
}
#footerText {
font-family: 'Sniglet', cursive;
font-size: 35px;
margin-top: 25px;
}
</style>
<body onkeypress="window.onload">
<div id="snakeGroup">
<h1 id="snakeTitle">Snake ?</h1>
<p id="snakePara">Press the arrow keys ⬅️⬆️⬇️➡️ to move the snake.<br> Eat the food to score points. If the
snake touches the walls
or itself, its game over.<br> The game will automatically restart after 3 seconds. Happy Gaming!</p>
<h2 id="gameover">Score: <span id="gameScore"></span></h2>
<canvas id="canvas" width="500px" height="500px"></canvas>
<h3 id="footerText">Made with ❤️ by David Winters</h3>
</div>
<script src="snake.js"></script>
</body>
</html>
答案 6 :(得分:0)
您无法可靠地获取此信息。这里提供的几个答案的基础是检查HTTP请求的User-Agent标头。但是,无法知道User-Agent标头中的信息是否真实。发送请求的客户端可以在该标头中写入任何内容。所以它的内容可能是欺骗性的,或者根本不发送。
答案 7 :(得分:0)
此代码基于投票最多的问题,但我可能会更易于使用
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;
}
}
答案 8 :(得分:0)
从今天开始,这是我的代码,现在可以与某些最新的浏览器一起使用。
很自然地,它会随着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
答案 9 :(得分:-1)
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];
}