项目背景

原有的启动平台公共组件库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对浏览器工具类优化的更多相关文章

  1. 基于JSch的Sftp工具类

    本Sftp工具类的API如下所示. 1)构造方法摘要 Sftp(String host, int port, int timeout, String username, String password ...

  2. 【SSH三大框架】Hibernate基础第二篇:编写HibernateUtil工具类优化性能

    相对于上一篇中的代码编写HibernateUtil类以提高程序的执行速度 首先,仍然要写一个javabean(User.java): package cn.itcast.hibernate.domai ...

  3. iOS开发——基于corelocation位置定位——工具类

    (代码工具类已写好,空闲时间整理成文档,待更新……)

  4. 基于SqlClient开发SQLServer工具类 伸手党的福音

    注意:代码直接Copy调用即可,SQLServer工具类跟我上一个Oracle工具类有所不同,区别在于调用存储过程中时参数的使用,无需输入对应的存储游标名称 特点:根据用户传入的参数类型来识别存储中对 ...

  5. Java 基于log4j的日志工具类

    对log4j日志类进行了简单封装,使用该封装类的优势在于以下两点: 1.不必在每个类中去创建对象,直接类名 + 方法即可 2.可以很方便的打印出堆栈信息 package com.tradeplatfo ...

  6. 基于durid的JDBCUtils工具类

    1.JDBCUtils类 package com.alphajuns.utils; import com.alibaba.druid.pool.DruidDataSourceFactory; impo ...

  7. 基于Java8的日期时间工具类DateTimeFormatter

    原文:https://blog.csdn.net/qq_36596145/article/details/85331002 import java.time.Instant; import java. ...

  8. java导出数据EXCEL的工具类(以spring-webmvc-4.0.4jar为基础)

    1.本工具类继承于  spring-webmvc-4.0.4jar文件心中的一个类   AbstractExcelView 2.代码如下 package com.skjd.util; import j ...

  9. JDBC基础:JDBC快速入门,JDBC工具类,SQL注入攻击,JDBC管理事务

    JDBC基础 重难点梳理 一.JDBC快速入门 1.jdbc的概念 JDBC(Java DataBase Connectivity:java数据库连接)是一种用于执行SQL语句的Java API,可以 ...

  10. 基于jdk1.7实现的excel导出工具类

    通用excel导出工具类,基于泛型.反射.hashmap 以及基于泛型.反射.bean两种方式 import java.io.*;import java.lang.reflect.Field;impo ...

随机推荐

  1. 基于CUBEMX的STM32F4 Hal库,配置LVGL(无操作系统版)

    本篇文章移植思路适用于所有嵌入式MCU,包括Arm,STM32,NXP,乐鑫,Nuvoton,Arduino,RT-Thread,Zephyr,NuttX,Adafruit等等. 为什么要写这一篇移植 ...

  2. 用 GPT-4 给开源项目 GoPool 重构测试代码 - 每天5分钟玩转 GPT 编程系列(8)

    目录 1. 好险,差点被喷 2. 重构测试代码 2.1 引入 Ginkgo 测试框架 2.2 尝试改造旧的测试用例 2.3 重构功能测试代码 3. 总结 1. 好险,差点被喷 早几天发了一篇文章:&l ...

  3. PhotoShop Beta(爱国版)安装教程-内置AI绘画功能

    PS beta版安装教程 Window和Mac版都有,里面内置AI绘画功能 ps Beta版真的太爽了,今天来和大家分享下安装教程. 很多人拿这资料卖5块 9.9 19.9,球友们直接用,建议赶紧装, ...

  4. (2023.8.28)Hi铁布衫-CM Ver 0.001 - Cracked-writeup

    Hi铁布衫-CM Ver 0.001 WriteUp 本文作者:XDbgPYG(小吧唧) 发布时间:2023年8月28日 内容概要:Hi铁布衫-CM Ver 0.001 WriteUp 收集信息 有一 ...

  5. 解密Prompt系列14. LLM Agent之搜索应用设计:WebGPT & WebGLM & WebCPM

    前两章,我们分别介绍了基于微调和prompt的工具调用方案,核心都是如何让大模型和工具进行交互,包括生成工具调用语句和处理工具调用请求.不过在实际应用中,想要设计一个可以落地的LLM Agent,需要 ...

  6. 完全卸载MySQL服务的方法

    1. 重新运行安装文件,单击remove移除mysql.此时安装目录中的文件没有完全移除,需要手动删除安装目录的Mysql文件夹. 2. 如果MySQL服务没有移除的话,以管理员方式运行cmd命令:s ...

  7. Linux Ubuntu 安装Qt【安装完可以直接运行】

    1.安装 Qt: 第一步:到官网http://download.qt.io/archive/qt/下载 Qt 安装包,此处本人安装的是 qt-opensource-linux-x64-5.7.0.ru ...

  8. 「luogu - P3911」最小公倍数之和

    link. Denote \(cnt_{x}\) = the number of occurrences of \(x\), \(h\) = the maximum of \(a_i\), there ...

  9. 第一次git上传的完整流程

    第一次git上传的完整流程 使用git简单命令上传代码push到远程仓库 + 简单介绍了一个.git文件结构. 代码上传到gitee和github流程一样的,不过你上传到github可能网不行失败,所 ...

  10. CF1338A

    题目简化和分析: \(a_{i}\ge a_{i-1}\) 已经满足直接跳过 \(a_{i}<a_{i-1}\) 我们就要将其的差进行二进制的分解,使得 \(a_{i-1}=a_i\) 我也不知 ...