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

  金牌会员 | 2024-2-6 02:04:30 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 881|帖子 881|积分 2643

项目背景

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

开始改造

1、maven依赖替换

替换前
  1. <dependency>
  2.    <groupId>eu.bitwalker</groupId>
  3.    <artifactId>UserAgentUtils</artifactId>
  4.    <version>1.21</version>
  5. </dependency>
复制代码
替换后
  1. <dependency>
  2.     <groupId>com.blueconic</groupId>
  3.     <artifactId>browscap-java</artifactId>
  4.     <version>1.4.1</version>
  5. </dependency>
复制代码
说明:browscap-java的1.4.1版本实在2023年7月维护的
2、公共方法抽取

原有实现是基于UserAgentUtils的,首先从请求头中获取到User-Agent,再通过parseUserAgentString()方法获取到UserAgent对象,然后在调用对象的getBrowser()方法获取到浏览器对象Browser,进而获取到浏览器相关信息。
  1. private static Browser getBrowser(HttpServletRequest request) {
  2.     return UserAgent.parseUserAgentString(request.getHeader("User-Agent")).getBrowser();
  3. }
复制代码
现有实现是基于的,首先获取到UserAgentParser对象,基于对象的parse()方法去解析请求头,进而获取Capabilities对象,基于Capabilities对象的getValue()方法获取客户端浏览器和客户端操作系统等信息。
  1. private static Capabilities getCapabilities(HttpServletRequest request) {
  2.     try {
  3.         UserAgentParser userAgentParser = new UserAgentService().loadParser();
  4.         return userAgentParser.parse(request.getHeader("User-Agent"));
  5.     } catch (Exception e) {
  6.         throw new RuntimeException(e);
  7.     }
  8. }
复制代码
3、获取远程客户端系统名称

改造前
  1. public static String getOsName(HttpServletRequest request) {
  2.     UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"));
  3.     return userAgent.getOperatingSystem().getName();
  4. }
复制代码
改造后
  1. public static String getOsName(HttpServletRequest request) {
  2.     Capabilities capabilities = getCapabilities(request);
  3.     return capabilities.getPlatform();
  4. }
复制代码
4、获取远程客户端系统版本
  1. public static String getOsVersion(HttpServletRequest request) {
  2.     Capabilities capabilities = getCapabilities(request);
  3.     return capabilities.getPlatformVersion();
  4. }
复制代码
改造前,并不支持
5、获取远程客户端浏览器名称

改造前
  1. public static String getBrowserName(HttpServletRequest request) {
  2.     Browser browser = getBrowser(request);
  3.     return browser.getName();
  4. }
复制代码
改造后
  1. public static String getBrowserName(HttpServletRequest request) {
  2.     Capabilities capabilities = getCapabilities(request);
  3.     return capabilities.getBrowser();
  4. }
复制代码
6、获取远程客户端浏览器版本

改造前
  1. public static String getBrowserVersion(HttpServletRequest request) {
  2.     Browser browser = getBrowser(request);
  3.     Version version = browser.getVersion(request.getHeader("User-Agent"));
  4.     return version.getVersion();
  5. }
复制代码
改造后
  1. public static String getBrowserVersion(HttpServletRequest request) {
  2.     Capabilities capabilities = getCapabilities(request);
  3.     return capabilities.getBrowserMajorVersion();
  4. }
复制代码
7、至于其他方法,大家自行拓展验证

改造验证

1、浏览器信息准备


2、main方法验证
  1. public static void main(String[] args) {
  2.     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";
  3.     try {
  4.         UserAgentParser userAgentParser = new UserAgentService().loadParser();
  5.         Capabilities capabilities = userAgentParser.parse(userAgent);
  6.         System.out.println("系统名称==>" + capabilities.getPlatform() + "/" + capabilities.getPlatformVersion());
  7.         System.out.println("浏览器信息==>" + capabilities.getBrowser() + "/" + capabilities.getBrowserMajorVersion());
  8.     } catch (Exception e) {
  9.         throw new RuntimeException(e);
  10.     }
  11. }
复制代码
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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表