埋点(Track)是指在应用程序、网站或平台中添加代码,以记录特定用户行为和事件的做法。通过添加埋点代码,可以观察和分析用户行为,以调整和改进产品设计和使用体验。

在互联网应用中,常用的一些埋点行为包括:

- 页面浏览次数及时长;
- 用户交互行为(例如点击、悬停、滚动等);
- 表单提交及验证失败次数;
- 错误日志收集;
- 订单转化率等。

通常,在产品设计之初就应该考虑到需要哪些埋点,并在代码中嵌入相应的埋点代码。随着产品的发展,还可以根据用户反馈和数据分析结果不断补充和完善埋点方案。

在Java后端开发中,可以使用一些成熟的埋点框架进行埋点,例如阿里巴巴的canal和pinpoint等。这些框架提供了直观的可视化界面,帮助开发人员快速定位和解决问题。同时,也可以基于自己的业务需要定制化开发相应的埋点程序。

下面是一个Spring Boot项目关于页面访问次数的埋点示例:

  1. 首先,我们需要引入 Servlet 相关的依赖包。在 pom.xml 中添加如下依赖:
<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
  </dependency>
</dependencies>
  1. 创建一个名为 "CountFilter" 的过滤器,这个过滤器的 @WebFilter(urlPatterns = "/*") 注解中指定了所有匹配请求的 URL 路径("/*"),因此所有的请求都会通过此过滤器,并进入此过滤器的 doFilter() 方法。在 doFilter() 方法中,我们可以为某些需要统计的指标做处理,例如页面的访问次数、请求的响应时间等。
  2. 第二个注解:@Order(1) 是用来指定过滤器执行的顺序的。过滤器可以有多个,在处理请求时,根据 @Order() 注解的值,定义过滤器的执行顺序。@Order(1) 表示优先级最高的过滤器,会最先执行。如果没有指定 @Order() 注解,则默认为最低优先级。
    在 Spring Boot 中,可以使用自动配置机制,在应用程序中成功注册任意数量的过滤器。默认情况下,注册的过滤器没有指定顺序,这可以通过为过滤器添加 @Order() 注解来指定顺序。
    例如,一个过滤器注解中的 @Order(1) 会比另一个注解中的 @Order(2) 的过滤器先执行。如果没有明确指定顺序,则优先级最低的过滤器最后执行。
  3. 在其中添加 Web 页面访问次数的埋点代码。在 CountFilter 中,我们可以使用 aop 编程,在请求执行前后织入相应的逻辑进行统计访问次数。
@Component
@Order(1)
@WebFilter(urlPatterns = "/*")
public class CountFilter implements Filter {

    private static Logger logger = LoggerFactory.getLogger(CountFilter.class);

    @Autowired
    RedisTemplate<String, String> redisTemplate;

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        // 记录访问次数逻辑
        String key = "count:" + request.getRequestURI();
        Long count = redisTemplate.opsForValue().increment(key);
        logger.info("【CountFilter】{} 访问次数增加为:{}", request.getRequestURI(), count);

        filterChain.doFilter(request, response);
    }

}

注: 这里使用了 Redis 来记录访问次数。

  1. 测试埋点功能。启动 Spring Boot 应用,访问任意页面,控制台输出类似以下信息。
【CountFilter】/pages/index.html 访问次数增加为:1

这就是一个简单的基于过滤器实现的页面访问次数的埋点示例。