Spring Boot 实现请求设备来源统计与UA解析全攻略

在 Web 应用的实际场景中,我们经常需要知道 请求来自哪里 —— 是 Android 手机?还是 iOS?或者是 PC 浏览器?
这类信息往往可以通过 User-Agent (UA) 来统计,进而帮助我们分析用户画像、设备分布、埋点监控,甚至用于灰度发布。

本文将介绍如何在 Spring Boot 项目中,基于 UA 实现设备来源统计,并给出完整的代码与实践方案。


1. 背景与目标

  • 需求背景
    在业务中,我们想要统计:
    • 多少用户来自 Android / iOS
    • 哪些浏览器访问最多(Chrome、Safari、Edge…);
    • 用户操作系统分布(Windows、Mac、Linux…)。
  • 挑战
    直接读取 UA 字符串可行,但 UA 本身复杂、可变且容易被伪造,不同厂商 UA 格式差异巨大。
    因此,我们需要借助 UA 解析库 来进行标准化处理。

2. UA 与设备来源简介

UA 示例:

Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) 
AppleWebKit/605.1.15 (KHTML, like Gecko) 
Version/16.0 Mobile/15E148 Safari/604.1

解析后可得:

  • 操作系统:iOS 16.0
  • 设备类型:Mobile(iPhone)
  • 浏览器:Safari

⚠️ 注意事项

  1. 部分新版本浏览器已逐步弃用 UA,转向 User-Agent Client Hints (UA-CH)
  2. UA 可伪造,统计结果仅供参考。

3. 技术方案设计

我们可以通过以下三步实现:

  1. 拦截请求
    使用 HandlerInterceptorFilter 统一拦截请求,提取 User-Agent 头。
  2. 解析 UA
    借助开源库,如:
    • ua-parser/uap-java
    • YAUAA (Yet Another UserAgent Analyzer)
  3. 存储与统计
    • 实时统计:放入 Redis 计数;
    • 长期统计:写入 MySQL/ES,便于做 BI 报表。

流程图如下:

Http Request
Spring Interceptor
提取User-Agent
UA解析库
设备/浏览器/系统信息
Redis实时统计
MySQL持久化
BI 报表/可视化

4. Spring Boot 实现步骤

4.1 引入依赖

ua-parser 为例:

<dependency><groupId>ua_parser</groupId><artifactId>ua-parser</artifactId><version>1.4.3</version>
</dependency>

4.2 定义拦截器

@Component
public class UaInterceptor implements HandlerInterceptor {private final UserAgentParser parser = new UserAgentParser();@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {String uaString = request.getHeader("User-Agent");if (uaString != null) {Client client = parser.parse(uaString);String os = client.os.family;       // 操作系统String device = client.device.family; // 设备String browser = client.userAgent.family; // 浏览器log.info("设备来源统计: OS={}, Device={}, Browser={}", os, device, browser);// TODO: 写入 Redis / DB 做统计}return true;}
}

4.3 注册拦截器

@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate UaInterceptor uaInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(uaInterceptor).addPathPatterns("/**");}
}

5. 扩展优化

  1. 持久化统计

    • 将统计结果写入 MySQL,做长期数据报表;
    • 或接入 ELK/ClickHouse,做实时大屏展示。
  2. Redis 实时计数

    redisTemplate.opsForHash().increment("ua:os", os, 1);
    redisTemplate.opsForHash().increment("ua:browser", browser, 1);
    redisTemplate.opsForHash().increment("ua:device", device, 1);
    
  3. 接入 AOP 统一埋点
    @Aspect 在所有 Controller 方法入口记录 UA,避免手动重复埋点。

  4. 结合飞书/钉钉告警
    当某类设备异常暴涨时,自动告警。


6. 总结

  • 核心点:通过拦截器获取 User-Agent,使用 UA解析库 转换为可读信息。
  • 存储统计:实时写 Redis,长期写 MySQL/ES。
  • 应用场景:用户画像、流量分析、灰度发布、埋点监控。

未来趋势上,浏览器逐步过渡到 UA-CH (Client Hints),我们也要逐步兼容新的头部字段,如 Sec-CH-UA-PlatformSec-CH-UA-Mobile 等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/96734.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/96734.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/96734.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

技术框架搭建:支撑竞拍全流程

纯竞拍的技术框架是一个多层协同的系统&#xff0c;从用户交互到数据处理&#xff0c;每个环节都有专门的技术组件提供支持。​前端层是用户与竞拍系统交互的窗口&#xff0c;核心目标是提供流畅、实时、直观的操作体验。采用 React、Vue 等主流前端框架构建单页应用&#xff0…

2025.8.18-2025.8.24第34周:有内耗有挣扎

&#x1f31f; 本周完成的3件亮点事情&#xff08;可具体写过程&#xff09;&#xff1a; openvla debug起来了把上周的演讲视频发给了导师&#xff0c;人家帮我提了很多建议。罗永浩&#xff0c;李想4小时访谈看完了即兴演讲开始不内耗&#xff0c;直接讲&#xff0c;这样才能…

点播视频预览是怎么做到的?

看进度条上的小窗口&#xff0c;你有没有想过&#xff0c;哔哩哔哩是如何在进度条上显示视频预览的? 这个功能非常有用&#xff0c;尤其是在播放长视频时。 如何才能实现? 实现这一点有三种方法。 预先为视频生成 CSS sprites&#xff0c;并通过 API 获取预先为视频生成 W…

prometheus监控kubernetes集群并使用 grafana展示数据

目录 Prometheus组成及架构 prometheus核心组件 1.Prometheus Server 2.Exporters 3.Alertmanager 4.Pushgateway 数据流程 在k8s中部署PrometheusGrafana钉钉告警邮件告警 将kube-Prometheus包下载后传入虚拟机 tar -xzv kube-promethus.zip cd 进入 ll 显示目录 …

K8s 实战:Pod 版本更新回滚 + 生命周期管控

一、版本更新与回滚实验背景本实验通过 Kubernetes 的 Deployment 资源演示应用的版本更新与回滚流程。Deployment 是 Kubernetes 中用于管理 Pod 和 ReplicaSet 的核心资源&#xff0c;支持滚动更新&#xff08;避免服务中断&#xff09;和版本回滚&#xff08;应对更新故障&a…

静电服漏检率↓79%!陌讯多模态识别算法在智慧安检的实战解析

​原创声明​​&#xff1a;本文技术方案引自《陌讯视觉算法技术白皮书V3.1》&#xff0c;实测数据来自工业场景部署验证 一、行业痛点&#xff1a;静电防护失效的隐形风险 据《电子制造业安防报告2025》统计&#xff0c;精密电子车间因静电服穿戴不规范导致的次品率高达23%&a…

StarRocks不能启动 ,StarRocksFe节点不能启动问题 处理

StarRocks不能启动 &#xff0c;StarRocksFe节点不能启动问题 处理 问题描述 mysql:[Warning] Using a passwordon the command line interface can be insecureERROR 2003 (HYa00): Can’t connect to MysoL server on ‘192.168.5.128:9030’(111)Error: failed to query fE…

麒麟系统播放图片 速度比较

pygame效果比opencv好&#xff0c;opencv有锯齿&#xff1a;import pygame import os import timedef show_image_sdl(image_path):"""使用SDL2快速显示图片"""# 初始化pygamepygame.init()# 获取屏幕信息info pygame.display.Info()screen_wid…

复杂场景横幅识别准确率↑91%!陌讯多模态融合算法在智慧园区的实战解析

一、行业痛点&#xff1a;园区违规横幅识别的三重挑战 据《2024智慧园区安防报告》&#xff08;来源&#xff1a;CCSA TC10&#xff09;统计&#xff1a; ​​强光干扰​​&#xff1a;玻璃幕墙反光导致文字识别错误率超50% ​​形变干扰​​&#xff1a;横幅褶皱、飘动造成关…

Mybatis Plus - 代码生成器简单使用

1.引入依赖<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.12</version></dependency><dependency><groupId>com.baomidou</groupId><ar…

vue2腾讯地图点击地图获取地址经纬度web

注意&#xff1a;&#xff01;&#xff01;&#xff01;在做uniapp小程序导航功能时&#xff0c;拿到我们在后台管理设置的经纬度&#xff0c;根据经纬度去导航到店的时候&#xff0c;最好用腾讯地图来获取经纬度&#xff0c;uniapp小程序那边默认导航经纬度是腾讯系的&#xf…

7.6 残差网络

随着我们设计越来越深的网络&#xff0c;深刻理解 新添加的层如何提升神经网络的性能&#xff0c;变得至关重要。更重要的是设计网络的能力&#xff0c;在这种网络中&#xff0c;添加层会使网络更具有表达力&#xff0c;为了取得质的突破&#xff0c;需要一些数学基础。7.6.1 函…

建模工具Sparx EA的多视图协作教程

在传统建模工具中&#xff0c;功能繁杂、界面混乱、窗口频繁切换等问题长期困扰着架构师与开发人员&#xff0c;不仅拖慢设计节奏&#xff0c;更导致模型与文档严重脱节。企业架构与建模平台Sparx EA直面这些挑战&#xff0c;通过现代化的Ribbon界面与多视图协作机制&#xff0…

从聚类到集成,两种实用算法框架分享

一、K-means&#xff1a;让数据自己 “找组织”什么是聚类&#xff1f;聚类属于无监督学习的范畴 —— 简单说就是手里没有标签时&#xff0c;我们要把长得像的样本分到一组。比如给一堆用户数据&#xff0c;不需要提前知道 “高价值用户”“潜在用户” 这些标签&#xff0c;聚…

Elasticsearch:什么是神经网络?

神经网络定义 神经网络&#xff08;Neural networks&#xff09;是机器学习&#xff08;machine learning&#xff09;的一个子集&#xff0c;旨在模拟生物大脑的结构和功能。也称为人工神经网络 (artificial neural networks - ANNs)&#xff0c;神经网络由互连的节点或人工神…

XTDrone——无人机基于2D激光Lidar进行二维运动规划(细节提醒以及相关报错解决)

参考XTDrone文档&#xff1a; 二维激光SLAM&#xff08;HectorSLAM&#xff09; 语雀 二维运动规划 语雀 相关ROS依赖库&#xff1a; 本地基于的是20.04的ubuntu系统&#xff1a; sudo apt install -y ros-noetic-move-base \ ros-noetic-costmap-2d \ ros-noetic-dwa-l…

机器学习算法-朴素贝叶斯

朴素贝叶斯分类器就是根据贝叶斯公式计算结果进行分类的模型&#xff0c;“朴素”指事件之间相互独立无影响. 例 如&#xff1a;有如下数据集&#xff1a;Text CategoryA great game&#xff08;一个伟大的比赛&#xff09;Sports&#xff08;体育运动&#xff09;The e…

RoPE, 2D RoPE, 3D RoPE和复数

旋转位置编码是一种用于Transformer架构中的位置编码方法&#xff0c;从复数的角度来看&#xff0c;其主要利用了复数的乘法性质来实现位置编码&#xff0c;以下作为学习记录&#xff1a;1. 旋转位置编码1&#xff09;对于输入序列的每个位置的嵌入向量&#xff0c;将嵌入向量分…

Java静态代理与动态代理实战解析

Java静态代理 示例代码 接口&#xff1a; package com.ssg.aop.interfaces;public interface MathCalculator { // 加法public int add(int a, int b); }接口实现类&#xff1a; package com.ssg.aop.impl; import com.ssg.aop.interfaces.MathCalculator;public class Math…

如何排查服务器DNS解析失败的问题

服务器 DNS 解析失败会导致无法访问域名&#xff08;如 google.com&#xff09;&#xff0c;可能影响服务器的正常运行。以下是排查 DNS 解析失败问题的详细步骤&#xff0c;包括可能的原因、诊断方法和解决方案。1. 原因分析DNS 解析失败通常由以下原因引起&#xff1a;DNS 配…