个人博客 地址:http://www.wenhaofan.com/article/20181125220342

在开发AutuBlog项目时需要做后台的登录记录,想起浏览器的User-Agent,于是尝试从浏览器的请求头中获取一些有用的信息。

通过总结大量请求头数据写出以下正则

^Mozilla/\d\.\d\s+\(+.+?\)

该正则含义为

以Mozilla/开头+浏览器版本格式为数字.数字+空格+(+任意字符串+匹配第一个)

测试数据

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36

Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36

Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:36.0) Gecko/20100101 Firefox/36.0

Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36

经测试可以顺利的获取到设备 以及操作系统信息

完整工具类代码如下

package com.autu.common.kit;

import java.util.regex.Matcher;
import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; public class AgentUserKit {
private static String pattern = "^Mozilla/\\d\\.\\d\\s+\\(+.+?\\)";
private static String pattern2 = "\\(+.+?\\)";
private static Pattern r = Pattern.compile(pattern);
private static Pattern r2 = Pattern.compile(pattern2); public static String getDeviceInfo(HttpServletRequest request) {
String userAgent = request.getHeader("User-Agent");
return getDeviceInfo(userAgent);
} private static String getDeviceInfo(String userAgent) {
Matcher m = r.matcher(userAgent);
String result = null;
if (m.find()) {
result = m.group(0);
} Matcher m2 = r2.matcher(result);
if (m2.find()) {
result = m2.group(0);
}
result = result.replace("(", "");
result = result.replace(")", "");
return filterDeviceInfo(result);
} public static String filterDeviceInfo(String result) {
if (StrKit.isBlank(result)) {
return null;
}
result = result.replace(" U;", "");
result = result.replace(" zh-cn;", "");
return result;
} public static void main(String[] args) {
System.out.println(getDeviceInfo(
"Mozilla/5.0 (Linux; U; Android 7.0; zh-cn; MI 5s Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.128 Mobile Safari/537.36 XiaoMi/MiuiBrowser/10.2.2"));
} }

如果有发现不能匹配的请求头欢迎留言

java通过浏览器请求头(User-Agent)获取访问者设备信息以及系统版本的更多相关文章

  1. selenium.Phantomjs设置浏览器请求头

    from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCap ...

  2. python入门常用方法(转json,模拟浏览器请求头,写入文件)

    转json import jsonjson = json.loads(html) 模拟浏览器请求头 import urllib.request req = urllib.request.Request ...

  3. 【转】android 安卓APP获取手机设备信息和手机号码的代码示例

    http://blog.csdn.net/changemyself/article/details/7421476 下面我从安卓开发的角度,简单写一下如何获取手机设备信息和手机号码 准备条件:一部安卓 ...

  4. android 安卓APP获取手机设备信息和手机号码的代码示例

    下面我从安卓开发的角度,简单写一下如何获取手机设备信息和手机号码 准备条件:一部安卓手机.手机SIM卡确保插入手机里.eclipse ADT和android-sdk开发环境 第一步:新建一个andro ...

  5. Python学习---Django的request扩展[获取用户设备信息]

    关于Django的request扩展[获取用户设备信息] settings.py INSTALLED_APPS = [ ... 'app01', # 注册app ] STATICFILES_DIRS ...

  6. Atitit.获取主板与bios序列号获取硬件设备信息  Wmi wmic 的作用

    Atitit.获取主板与bios序列号获取硬件设备信息  Wmi wmic 的作用 1 获取硬件核心基础核心基础Wmi1 2 其他资料2 3 Wmic WMI 命令行接口2 4 Atitit.获取主板 ...

  7. JavaScript获取访问设备信息

    <html xmlns=http://www.w3.org/1999/xhtml> <head> <title>JavaScript获取访问设备信息</tit ...

  8. Qt 获取usb设备信息 hacking

    /************************************************************************** * Qt 获取usb设备信息 hacking * ...

  9. ?Object-C获取手机设备信息

    一.获取UiDevice设备信息 // 获取设备名称 NSString *name = [[UIDevice currentDevice] name]; // 获取设备系统名称 NSString *s ...

随机推荐

  1. SecureCRT的下载、安装( 过程非常详细!!值得查看)

    SecureCRT的下载.安装( 过程非常详细!!值得查看) 简单介绍下SecureCRT 一.SecureCRT的下载 二.SecureCRT的安装 简单介绍下SecureCRT SecureCRT ...

  2. wifite硬核破解WiFi密码

    如题 楼主在这里分享下如何使用工具破解附近的WiFi 今天使用的工具是 wifite 现在都有WiFi万能钥匙了 暴力破解还有市场吗? 首先他俩的破解思路就不一样 wifi万能钥匙是根据云端数据库内容 ...

  3. UNIX环境高级编程-第三章习题

    1,当读写磁盘文件时,read,write等函数确实是不带缓冲机制的吗?请说明原因. 答:所有磁盘I/O都要经过内核的块缓存区(即内核的缓冲区高速缓存).唯一例外的是对原始磁盘设备的I/O,但是我们不 ...

  4. 何时使用异步或同步AJAX

    通常最好使用异步调用 通过优锐课核心java学习笔记中,我们可以看到,码了很多专业的相关知识, 分享给大家参考学习. AJAX代表异步JavaScript和XML,是一项允许异步更新网页的技术,这意味 ...

  5. Java连载73-String方法简介

    一.字符串常用的方法 package com.bjpowernode.java_learning; ​ public class D73_StringMethodBriefIntroduction { ...

  6. MongoDB3.4版本新增特性

    先说明一下mongod和mongos的含义:mongod是MongoDB系统的主要后台进程,它处理数据请求.管理数据访问和执行后台管理操作:该命令的命令行选项主要用于测试,在场景操作中,使用配置文件选 ...

  7. 如何开启音乐二倍速?不下载其他软件【win10】

    使用windows自带的windows media player开启N倍速 绪言 额……暑假将终,我想起了件事:貌似我忘记帮你们开好二倍速再走了. 可能我回(六班)来的机会也比较少,废话不多说,直接看 ...

  8. JAVA类变量、类方法

    类变量(static) 类变量是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量. public class C { ...

  9. 【读书笔记】自然语言处理综述 -- 第四章 -- N元语法

    第四章 N元语法 本章开篇的两句话很有意思,代表了当时两个学派的思想和矛盾. 一句是"有史以来最伟大的语言学家"乔姆斯基说的:"句子的概率,在任何已知的对于这个术语的解释 ...

  10. Nginx-3.控制nginx

    原文 nginx 通过信号来控制.对应linux系统就是用kill命令. The command kill sends the specified signal to the specified pr ...