基于Browscap对浏览器工具类优化

项目背景

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

开始改造

1、maven依赖替换

替换前

xml 复制代码
<dependency>
   <groupId>eu.bitwalker</groupId>
   <artifactId>UserAgentUtils</artifactId>
   <version>1.21</version>
</dependency>

替换后

xml 复制代码
<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,进而获取到浏览器相关信息。

java 复制代码
private static Browser getBrowser(HttpServletRequest request) {
    return UserAgent.parseUserAgentString(request.getHeader("User-Agent")).getBrowser();
}

现有实现是基于的,首先获取到UserAgentParser对象,基于对象的parse()方法去解析请求头,进而获取Capabilities对象,基于Capabilities对象的getValue()方法获取客户端浏览器和客户端操作系统等信息。

java 复制代码
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、获取远程客户端系统名称

改造前

java 复制代码
public static String getOsName(HttpServletRequest request) {
    UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"));
    return userAgent.getOperatingSystem().getName();
}

改造后

java 复制代码
public static String getOsName(HttpServletRequest request) {
    Capabilities capabilities = getCapabilities(request);
    return capabilities.getPlatform();
}

4、获取远程客户端系统版本

java 复制代码
public static String getOsVersion(HttpServletRequest request) {
    Capabilities capabilities = getCapabilities(request);
    return capabilities.getPlatformVersion();
}

改造前,并不支持

5、获取远程客户端浏览器名称

改造前

java 复制代码
public static String getBrowserName(HttpServletRequest request) {
    Browser browser = getBrowser(request);
    return browser.getName();
}

改造后

java 复制代码
public static String getBrowserName(HttpServletRequest request) {
    Capabilities capabilities = getCapabilities(request);
    return capabilities.getBrowser();
}

6、获取远程客户端浏览器版本

改造前

java 复制代码
public static String getBrowserVersion(HttpServletRequest request) {
    Browser browser = getBrowser(request);
    Version version = browser.getVersion(request.getHeader("User-Agent"));
    return version.getVersion();
}

改造后

java 复制代码
public static String getBrowserVersion(HttpServletRequest request) {
    Capabilities capabilities = getCapabilities(request);
    return capabilities.getBrowserMajorVersion();
}

7、至于其他方法,大家自行拓展验证

改造验证

1、浏览器信息准备

2、main方法验证

java 复制代码
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

相关推荐
快乐肚皮9 分钟前
fencing token机制
java·fencing token
叶落阁主18 分钟前
Neovim 插件 i18n.nvim 介绍
java·vue.js·vim
渣哥19 分钟前
让集合线程安全的几种靠谱方法
java
dylan_QAQ21 分钟前
Java转Go全过程06-工程管理
java·后端·go
a587691 小时前
消息队列(MQ)初级入门:详解RabbitMQ与Kafka
java·分布式·microsoft·面试·kafka·rabbitmq
千里码aicood1 小时前
【springboot+vue】党员党建活动管理平台(源码+文档+调试+基础修改+答疑)
java·数据库·spring boot
Chan161 小时前
【智能协同云图库】基于统一接口架构构建多维度分析功能、结合 ECharts 可视化与权限校验实现用户 / 管理员图库统计、通过 SQL 优化与流式处理提升数据
java·spring boot·后端·sql·spring·intellij-idea·echarts
先做个垃圾出来………1 小时前
差分数组(Difference Array)
java·数据结构·算法
BillKu2 小时前
Java核心概念详解:JVM、JRE、JDK、Java SE、Java EE (Jakarta EE)
java·jvm·jdk·java ee·jre·java se·jakarta ee
刘婉晴2 小时前
【Java】NIO 简单介绍
java·nio