基于Browscap对浏览器工具类优化
项目背景
原有的启动平台公共组件库comm-util的浏览器工具类BrowserUtils是基于UserAgentUtils的,但是该项目最后一个版本发布于 2018/01/24,之至今日23年底,已有5年没有维护更新,会造成最新版本的部分浏览器不能正确获取到浏览器信息。(至于为什么停更了获取不到最新浏览器和操作系统信息了呢,文末给大家揭晓。)以至于公司的项目组团队不得已去寻找其他解决方案,做该工具类的优化更新。于是我们来到的项目官网,看到了官方公告也提示项目已停止更新,官方建议使用Browscap做代替。如下图:

开始改造
1、maven依赖替换
替换前
<dependency>
<groupId>eu.bitwalker</groupId>
<artifactId>UserAgentUtils</artifactId>
<version>1.21</version>
</dependency>
替换后
<dependency>
<groupId>com.blueconic</groupId>
<artifactId>browscap-java</artifactId>
<version>1.4.1</version>
</dependency>
说明:browscap-java的1.4.1版本实在2023年7月维护的
2、公共方法抽取
原有实现是基于UserAgentUtils的,首先从请求头中获取到User-Agent,再通过parseUserAgentString()方法获取到UserAgent对象,然后在调用对象的getBrowser()方法获取到浏览器对象Browser,进而获取到浏览器相关信息。
private static Browser getBrowser(HttpServletRequest request) {
return UserAgent.parseUserAgentString(request.getHeader("User-Agent")).getBrowser();
}
现有实现是基于的,首先获取到UserAgentParser对象,基于对象的parse()方法去解析请求头,进而获取Capabilities对象,基于Capabilities对象的getValue()方法获取客户端浏览器和客户端操作系统等信息。
private static Capabilities getCapabilities(HttpServletRequest request) {
try {
UserAgentParser userAgentParser = new UserAgentService().loadParser();
return userAgentParser.parse(request.getHeader("User-Agent"));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
3、获取远程客户端系统名称
改造前
public static String getOsName(HttpServletRequest request) {
UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"));
return userAgent.getOperatingSystem().getName();
}
改造后
public static String getOsName(HttpServletRequest request) {
Capabilities capabilities = getCapabilities(request);
return capabilities.getPlatform();
}
4、获取远程客户端系统版本
public static String getOsVersion(HttpServletRequest request) {
Capabilities capabilities = getCapabilities(request);
return capabilities.getPlatformVersion();
}
改造前,并不支持
5、获取远程客户端浏览器名称
改造前
public static String getBrowserName(HttpServletRequest request) {
Browser browser = getBrowser(request);
return browser.getName();
}
改造后
public static String getBrowserName(HttpServletRequest request) {
Capabilities capabilities = getCapabilities(request);
return capabilities.getBrowser();
}
6、获取远程客户端浏览器版本
改造前
public static String getBrowserVersion(HttpServletRequest request) {
Browser browser = getBrowser(request);
Version version = browser.getVersion(request.getHeader("User-Agent"));
return version.getVersion();
}
改造后
public static String getBrowserVersion(HttpServletRequest request) {
Capabilities capabilities = getCapabilities(request);
return capabilities.getBrowserMajorVersion();
}
7、至于其他方法,大家自行拓展验证
改造验证
1、浏览器信息准备

2、main方法验证
public static void main(String[] args) {
final String userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36";
try {
UserAgentParser userAgentParser = new UserAgentService().loadParser();
Capabilities capabilities = userAgentParser.parse(userAgent);
System.out.println("系统名称==>" + capabilities.getPlatform() + "/" + capabilities.getPlatformVersion());
System.out.println("浏览器信息==>" + capabilities.getBrowser() + "/" + capabilities.getBrowserMajorVersion());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
3、验证结果:可以正确识别

结尾彩蛋
为什么原有的工具类不能获取最新的浏览器和操作系统的信息呢?跟下源码你就明白了
操作系统信息封装
Windows

Android

Symbian

浏览器信息的封装
Edge

Chrome

项目地址
Gitee:https://gitee.com/startdis/startdis-comm
Github:https://github.com/startdis/startdis-comm
Gitlab:https://gitlab.com/startdis/startdis-comm

基于Browscap对浏览器工具类优化的更多相关文章
- 基于JSch的Sftp工具类
本Sftp工具类的API如下所示. 1)构造方法摘要 Sftp(String host, int port, int timeout, String username, String password ...
- 【SSH三大框架】Hibernate基础第二篇:编写HibernateUtil工具类优化性能
相对于上一篇中的代码编写HibernateUtil类以提高程序的执行速度 首先,仍然要写一个javabean(User.java): package cn.itcast.hibernate.domai ...
- iOS开发——基于corelocation位置定位——工具类
(代码工具类已写好,空闲时间整理成文档,待更新……)
- 基于SqlClient开发SQLServer工具类 伸手党的福音
注意:代码直接Copy调用即可,SQLServer工具类跟我上一个Oracle工具类有所不同,区别在于调用存储过程中时参数的使用,无需输入对应的存储游标名称 特点:根据用户传入的参数类型来识别存储中对 ...
- Java 基于log4j的日志工具类
对log4j日志类进行了简单封装,使用该封装类的优势在于以下两点: 1.不必在每个类中去创建对象,直接类名 + 方法即可 2.可以很方便的打印出堆栈信息 package com.tradeplatfo ...
- 基于durid的JDBCUtils工具类
1.JDBCUtils类 package com.alphajuns.utils; import com.alibaba.druid.pool.DruidDataSourceFactory; impo ...
- 基于Java8的日期时间工具类DateTimeFormatter
原文:https://blog.csdn.net/qq_36596145/article/details/85331002 import java.time.Instant; import java. ...
- java导出数据EXCEL的工具类(以spring-webmvc-4.0.4jar为基础)
1.本工具类继承于 spring-webmvc-4.0.4jar文件心中的一个类 AbstractExcelView 2.代码如下 package com.skjd.util; import j ...
- JDBC基础:JDBC快速入门,JDBC工具类,SQL注入攻击,JDBC管理事务
JDBC基础 重难点梳理 一.JDBC快速入门 1.jdbc的概念 JDBC(Java DataBase Connectivity:java数据库连接)是一种用于执行SQL语句的Java API,可以 ...
- 基于jdk1.7实现的excel导出工具类
通用excel导出工具类,基于泛型.反射.hashmap 以及基于泛型.反射.bean两种方式 import java.io.*;import java.lang.reflect.Field;impo ...
随机推荐
- Linux系统启动jmeter可视化界面
目的:方便在Linux系统调试jmeter脚本.操作:Linux启动jmeter可视化界面,不能使用root用户,需要创建新用户,切换到新用户启动jmeter. 1. 创建用户 创建一个新的系统用户. ...
- python将print的打印内容保存到日志
将python程序中的所有打印内容都输出到日志文件中,在程序执行完成后,方便查询程序运行过程是否出现异常. 1. 将打印内容输出到日志文件 1.1 代码实现: sys.stdout = open('s ...
- 利用pytorch自定义CNN网络(三):构建CNN模型
本文是利用pytorch自定义CNN网络系列的第三篇,主要介绍如何构建一个CNN网络,关于本系列的全文见这里. 笔者的运行设备与软件:CPU (AMD Ryzen 5 4600U) + pytorch ...
- 利用pytorch自定义CNN网络(四):损失函数和优化器
本文是利用pytorch自定义CNN网络系列的第四篇,主要介绍如何训练一个CNN网络,关于本系列的全文见这里. 笔者的运行设备与软件:CPU (AMD Ryzen 5 4600U) + pytorch ...
- Docker从入门到部署项目
Docker概念 Docker是一个开源的应用容器引擎,它是基于Go语言并遵从Apache2.0协议开源.Docker可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流 ...
- SpringMVC配置web.xml文件详解(列举常用的配置)
常用的web.xml的配置 1.Spring 框架解决字符串编码问题:过滤器 CharacterEncodingFilter(filter-name) 2.在web.xml配置监听器ContextLo ...
- 【io_uring】liburing 用户库源码分析
文章目录 整体流程 `io_uring_queue_init` `io_uring_get_sqe` `io_uring_prep_#OP` `io_uring_sqe_set_data` `io_u ...
- 记一次 .NET 某电力系统 内存暴涨分析
一:背景 1. 讲故事 前些天有位朋友找到我,说他生产上的程序有内存暴涨情况,让我帮忙看下怎么回事,最简单粗暴的方法就是让朋友在内存暴涨的时候抓一个dump下来,看一看大概就知道咋回事了. 二:Win ...
- oracle数据库性能监控常用sql
因执行时间较长建议使用plsql等第三方工具执行 --1.监控sga内存分配信息select * from v$sgainfo;--2.监控每个用户的磁盘io及io命中率select v$sess_i ...
- 栩栩如生,音色克隆,Bert-vits2文字转语音打造鬼畜视频实践(Python3.10)
诸公可知目前最牛逼的TTS免费开源项目是哪一个?没错,是Bert-vits2,没有之一.它是在本来已经极其强大的Vits项目中融入了Bert大模型,基本上解决了VITS的语气韵律问题,在效果非常出色的 ...