【Java后端】Spring Boot 实现请求设备来源统计与UA解析全攻略
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
⚠️ 注意事项:
- 部分新版本浏览器已逐步弃用 UA,转向 User-Agent Client Hints (UA-CH);
- UA 可伪造,统计结果仅供参考。
3. 技术方案设计
我们可以通过以下三步实现:
- 拦截请求
使用HandlerInterceptor
或Filter
统一拦截请求,提取User-Agent
头。 - 解析 UA
借助开源库,如:- ua-parser/uap-java
- YAUAA (Yet Another UserAgent Analyzer)
- 存储与统计
- 实时统计:放入 Redis 计数;
- 长期统计:写入 MySQL/ES,便于做 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. 扩展优化
-
持久化统计
- 将统计结果写入 MySQL,做长期数据报表;
- 或接入 ELK/ClickHouse,做实时大屏展示。
-
Redis 实时计数
redisTemplate.opsForHash().increment("ua:os", os, 1); redisTemplate.opsForHash().increment("ua:browser", browser, 1); redisTemplate.opsForHash().increment("ua:device", device, 1);
-
接入 AOP 统一埋点
用@Aspect
在所有 Controller 方法入口记录 UA,避免手动重复埋点。 -
结合飞书/钉钉告警
当某类设备异常暴涨时,自动告警。
6. 总结
- 核心点:通过拦截器获取
User-Agent
,使用 UA解析库 转换为可读信息。 - 存储统计:实时写 Redis,长期写 MySQL/ES。
- 应用场景:用户画像、流量分析、灰度发布、埋点监控。
未来趋势上,浏览器逐步过渡到 UA-CH (Client Hints),我们也要逐步兼容新的头部字段,如 Sec-CH-UA-Platform
、Sec-CH-UA-Mobile
等。