首页 > 其他分享 >基于Browscap对浏览器工具类优化

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

时间:2023-12-06 18:11:32浏览次数:31  
标签:浏览器 String request capabilities Browscap static return 优化

项目背景

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

image-20231206155849738.png

开始改造

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、浏览器信息准备

image-20231206163656269.png

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、验证结果:可以正确识别

image-20231206163542502.png

结尾彩蛋

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

操作系统信息封装

Windows

image-20231206164157916.png

Android

image-20231206164235052.png

Symbian
image-20231206164336819.png

浏览器信息的封装

Edge

image-20231206164439386.png

Chrome

image-20231206164516812.png

项目地址

Gitee:https://gitee.com/startdis/startdis-comm

Github:https://github.com/startdis/startdis-comm

Gitlab:https://gitlab.com/startdis/startdis-comm

公众号

标签:浏览器,String,request,capabilities,Browscap,static,return,优化
From: https://www.cnblogs.com/dianjiu/p/17880214.html

相关文章

  • 优化 uniapp 发行操作:一键打包、混淆代码
    ​ uniapp一键发行代码并混淆代码第一步.在项目根目录下安装插件npminstalljavascript-obfuscator-g  安装完成后,javascript-obfuscator就是一个独立的可执行命令了。javascript-obfuscator-v  第二步:HbuilderX点击发行按钮,打包代码到dist文件中小程序发行......
  • 故障发现、定位提效超 70%,去哪儿可观测体系做了哪些优化?
    一分钟精华速览去哪儿网的原有监控系统在指标数量上展现出了强大实力——上亿指标量和百万级的告警量,但在故障数据方面却稍显不足——订单类故障平均发现时间长达4分钟,仅有20%的订单类故障能在1分钟内被发现,近半数的故障处理时长超过30分钟。为了解决这些问题,去哪儿网决定从......
  • 多开工具对手机应用网络连接的优化与改进
    多开工具对手机应用网络连接的优化与改进摘要:随着智能手机应用的日益普及,用户对于多个账号同时登录一个应用程序的需求也在增加。为了满足这一需求,多开工具应运而生。本文将探讨多开工具在优化和改进手机应用网络连接方面的作用。引言:在日常生活中,我们经常需要同时登录不同的......
  • Vue 应用程序性能优化:代码压缩、加密和混淆配置详解
    ​简介在Vue应用程序的开发中,代码压缩、加密和混淆是优化应用程序性能和提高安全性的重要步骤。VueCLI是一个功能强大的开发工具,它提供了方便的配置选项来实现这些功能。本文将介绍如何使用VueCLI配置代码压缩、加密和混淆功能,以提高应用程序的性能和安全性。一、配置代......
  • 选择CRM系统时,企业应注意这些功能以优化业务管理
     CRM系统可以帮助企业整合各类销售渠道,精准获取客户需求,打通市场与销售之间的协作壁垒,提升客户转化效率。那么企业选择CRM系统时要注意的功能有哪些?一起跟着小编看看吧。一、市场管理通过CRM系统,市场人员可以通过电子邮件、电话咨询以及网络研讨会等方式举办活动,以获取初级销......
  • 解决谷歌浏览器 Google Chrome不能拖拽安装离线插件的办法
    我使用的谷歌浏览器版本是119.0.6045.160(正式版本)(64位)  之前多台电脑都可以通过拖拽安装crx格式的扩展程序,最近公司配好了新的笔记本,但今天下载好crx文件发现拖动之后并不可以安装,并且已经打开了开发者模式,还是会显示禁用的小图标。解决方式首先打开下面地址:chrome://fla......
  • rust webassembly 优化参考资料
    这几天在学习webassembly,尤其是cerboslite对于webassembly的支持,所以简单整理一些chatgpt给的一些建议WebAssembly(Wasm)的优化涉及多个方面,包括编译器优化、代码结构调整、资源管理和压缩等。以下是一些通用的WebAssembly优化策略:编译器优化:使用适当的编译器标志启用优......
  • 《优化接口设计的思路》系列:第六篇—接口防抖(防重复提交)的一些方式
    一、前言大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。作为一名从业已达六年的老码农,我的工作主要是开发后端Java业务系统,包括各种管理后台和小程序等。在这些项目中,我设计过单/多租......
  • mysql 索引优化
     MySQL索引优化是提高数据库性能的关键步骤之一。下面是一些建议,以帮助你优化MySQL索引:最左前缀原则:确保查询条件使用了索引的最左侧列。如果查询没有涵盖索引的最左侧列,索引将不会被使用。选择性原则:具有高选择性的索引(即返回结果集中较小部分的索引)通常更有效。使......
  • 使用技巧 | 红米 Redmi Note 12 Turbo优化记录(去广告等)
    原文链接:https://engapi.com/article/7569原文也是我写的。我的红米Redminote8pro6+128已有些卡顿,遂在K70推出之际下单了RedmiNote12Turbo16+1T当备机。以下记录红米Note12Turbo去广告和优化过程,小米/红米系列都可参考。1.去广告系统设置参考这里:小米/红米手机如何......