Quantcast
Channel: CSDN博客推荐文章
Viewing all articles
Browse latest Browse all 35570

根据User-Agent字段获取客户端操作系统和浏览器版本

$
0
0
    今天在做一项测试的时候,需要获取客户端操作系统和浏览器版本,于是我就使用
HttpServletRequest httpRequest = (HttpServletRequest) request;
String agent = httpRequest.getHeader("User-Agent");
来获取客户端返回的字符串,由于我测试的浏览器主要基于chrome和IE内核,所以就先以这两种浏览器作为测试来讲解,很奇怪,基本上大多数的浏览器返回的头信息都是以“Mozilla”开头,这主要是因为:
IE加入mozilla的字符串是为了在当时netscape占领大部分市场的情况下告诉写网页他们的浏览器和netscape是兼容的。
第一轮浏览器大战最后以Netscape被收购,Internet Explorer独霸浏览器市场告终。而此时Mozilla的历史正是由这里开始。浏览器之战失利以后,Netscape并没有消失,为了挽回市场, 1998年Netscape将浏览器的大部分代码开源,成立了一个组织,计划开发下一代的 Netscape浏览器,这个组织就是Mozilla.org,它的图标是一只恐龙。 

不久后,Netscape的源代码就差不多被全部抛弃, Mozilla社团开发出了在稳定性和功能上更出色的新一代浏览器。这个浏览器就是Mozilla Application Suite,简称Mozilla(Mozilla这个名字的来源是Mosaic和Godzilla(怪兽哥斯拉)两个词的结合,意为 "Mosaic终结者"。 

起初,Mozilla是Netscape的吉祥物,也是Netscape Navigator浏览器使用的内部开发代号。由于Netscape早期的影响力,直到今天,所有浏览器包括IE,向Web服务器报告自己的浏览器标识的 时候,都以 "Mozilla"开头,表明自己是Mozilla兼容的。

wikipedia 中关于 User-Agent的一段说明
 
The earliest example of this is Internet Explorer's use of a User-Agent string beginning "Mozilla/<version> (compatible; MSIE <version>...", in order to receive content intended for Netscape Navigator, its main rival at the time of its development. This was not a reference to the open-source Mozilla browser, which was developed much later, but to the original codename for Navigator, which was also the name of the Netscape company mascot. This format of User-Agent string has since been copied by other user agents, partly because Explorer, in turn, came to dominate.

如果有兴趣的可以到wikipedia上进行查看,链接为:http://anonymouse.org/cgi-bin/anon-www.cgi/http://en.wikipedia.org/wiki/Useragent

另外有一个网站为http://www.user-agents.org/index.shtml  可以查询部分Useragent的相关信息。
当然了不清楚以上故事也无所谓,并不影响我们的code工作,最优的解决方案应该是使用正则表达式来匹配各种版本的浏览器,但是为了简单起见,我就以一个不太完善的方案来进行讲解。
    通过测试,
chrome浏览器头信息如下:
User-Agent=Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.160 Safari/537.22
IE浏览器头信息如下:
User-Agent=Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Tablet PC 2.0; .NET4.0C; .NET4.0E)
所以我们首先想到一个最笨的方法就是使用String.indexof(“”);方法来进行判断,如果含有要判断的字符串,那么函数返回其首次出现的索引值,否则函数返回“-1”
if (agent.indexOf("MSIE") != -1) {// 表示是IE浏览器
// IE浏览器获取操作系统和客户端浏览器
  //从请求头中读取User-Agent值
//构造StringTokenizer对象,使用“;”来分解User-Agent值
StringTokenizer st = new StringTokenizer(agent, ";");
st.nextToken();
//得到用户的浏览器名
browser = st.nextToken();
System.out.println("IE浏览器browser--->" + browser);
 //得到用户的操作系统名
os = st.nextToken();
System.out.println("IE浏览器os--->" + os);
} else if (agent.indexOf("Chrome") != -1) {// 表示是chrome浏览器
// chrome浏览器获取操作系统和客户端浏览器
StringTokenizer st = new StringTokenizer(agent, "()");
st.nextToken();
 //得到用户的操作系统名
os = st.nextToken();
System.out.println("chrome浏览器os----->" + os);
st.nextToken();
st.nextToken();
//得到用户的浏览器名
browser = st.nextToken();
System.out.println("chrome浏览器browser----->" + browser);
}
测试结果是可以正确获取操作系统和浏览器版本,比如我的windows7系统,获取的操作系统结果是Windows NT6.1
但是使用另外一种方法,System.out.println("System.getProperty(\"os.name\")="+System.getProperty("os.name"));获取的输出结果却是:System.getProperty("os.name")=Windows Vista,很是奇怪,个人猜测,这个可能与windows内核版本有关,在此不予深究。
作者:shijiebei2009 发表于2013-5-9 23:25:13 原文链接
阅读:31 评论:0 查看评论

Viewing all articles
Browse latest Browse all 35570

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>