个人博客 地址: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. Cesium动态绘制实体(点、标注、面、线、圆、矩形)

    //自定义绘制图形,支持 点,线,面,矩形,圆,标识,可自定义绘制过程中的和绘制完的预览 this.drawGraphic = function(view,_mode,_callback,_Graph ...

  2. ThreadPoolExecutor之RejectedExecutionHandler

    最近工作种常用到ThreadPoolExecutor这个对象, 这是一个并发编程中非常常用的对象.因为和并发编程相关所以它存在于java.util.concurrent这包中. 创建这个对象的基本方法 ...

  3. U盘装系统/win to go制作笔记

    //添加图片太麻烦了吧,我扔相册里了,需要自取吧. //U盘装系统 环境:win10戴尔灵越台式机 硬件:16G U盘,Windows电脑 软件:老毛桃启动装机工具,win10镜像1803版本 进入网 ...

  4. Integer使用==做判断遇到的问题

    问题: 最近使用Integer类型的数据做判断时,遇到了一个神奇的问题. 如: Integer a=223; Integer b=223; 这样使用==做判断,得到的结果是 false 原因: 后来查 ...

  5. VAR 学习笔记3

    脉冲响应图及方差分析 当使用VAR模型的时候需要完成: 选择合适的变量 就是研究变量这个没有疑问 判断滞后阶数 根据AIC和SC准则,选择 为何做格兰杰因果检验 如果给定 \(x_t\) 的滞后阶数, ...

  6. 重写了下Ajax请求Webservice,顺便复习一下Javascript的闭包概念

    var AjaxRequest = function(){ //返回处理结果的回调函数 this.agentCallBack = {}; //javascript 调用domino代理的方法. thi ...

  7. Python爬虫连载9-JS加密之“盐”​、ajax请求

    一.JS加密之“盐”​ 1.salt属性“盐":多用于密码学,比如我们的银行卡是六位密码,但是实际上在银行的系统里,我们输入密码后,会给原始的密码添加若干字符,形成更加难以破解的密码.这个过 ...

  8. 如何选择JavaScript构建工具之Babel、Browserify、Webpack、Grunt以及Gulp

    当我们开始一个新的 JavaScript 项目时,我们需要考虑的第一件事就是搭建一个前端编译环境.但是在面对众多的 JavaScript 构建工具时,我们却无所适从,不知道究竟哪一个才是最适合我们的. ...

  9. [TJOI2007] 足彩投注

    足彩投注 题目概述 题目背景 了解足球彩票的人可能知道,足球彩票中有一种游戏叫做"胜负彩",意为猜比赛的胜负.下面是一些与胜负彩有关的术语 注 :每一组有效组合数据. 投 注:彩民 ...

  10. 【学习笔记】:一天搞定HTML

    PS:许多控制样式的标签在HTML5中都不推荐使用,建议使用CSS,如align,border等. 一.概念 HTML的英文全称:Hypertext Marked Language 超文本标记语言. ...