网络-navigator.sendBeacon

news2025/6/21 9:52:05

文章目录

  • 前言
  • 一、navigator.sendBeacon是什么?
    • 优点
    • 缺点
  • 二、navigator.sendBeacon应用场景
  • 三、navigator.sendBeacon的使用
  • 四、用户停留时间埋点
  • 总结


前言

本文主要记录navigator.sendBeacon异步请求的使用,以及应用场景和埋点小demo。


一、navigator.sendBeacon是什么?

navigator.sendBeacon 是一个浏览器 API,用于在浏览器后台发送异步请求,不会等服务端响应。
它可以用于在页面卸载或关闭时发送数据,以及在不阻塞页面卸载的情况下发送数据。
使用 navigator.sendBeacon 方法发送的请求是异步的,不会阻塞页面的卸载或关闭过程。
这对于需要在用户离开页面之前发送数据的情况非常有用。

优点

  • 不受页面卸载过程的影响,确保数据可靠发送
    普通的http请求如XMLHttpRequest Fetch在页面关闭或者刷新、前进、后退等操作时这些请求有可能在页面销毁之前没有完成,导致数据丢失。也可以控制页面销毁延后,这就导致页面销毁时间增加。
  • 异步执行,不阻塞页面关闭或者跳转
    navigator.sendBeacon的优先级是较低的,XMLHttpRequest Fetch这些同步请求,以及其他高优先级任务在它之前,navigator.sendBeacon并不会立即执行,可以说它会在空闲时间发送请求。
  • 能够发送跨域请求
    navigator.sendBeacon是不受跨域限制的

缺点

  • 只能发送POST请求
  • 只能传输少量数据(64 KB以内)
  • 无法自定义请求头
  • 只能传输ArrayBufferArrayBufferViewBlobDOMStringFormDataURLSearchParams类型数据
  • 如果处于危险网络环境、开启了广告屏蔽插件 该请求将无效

二、navigator.sendBeacon应用场景

  • 发送心跳包
    利用navigator.sendBeacon发送心跳包,与服务器保持长连接,避免长时间未请求而断开连接。
function sendHeartbeat() {
  const data = 'heartbeat'; // 心跳包数据
  const url = 'http://localhost:3001/api/heartbeat'; // 心跳包目标 URL

  navigator.sendBeacon(url, data);
}

// 每隔一定时间发送心跳包
setInterval(sendHeartbeat, 5000); // 每 5 秒发送一次心跳包

心跳

  • 埋点
    可以使用navigator.sendBeacon在页面卸载时记录停留时间,以及pv、uv、错误日志的上报、按钮点击次数等
  • 用户反馈
    对于一些小的表单,如:用户反馈、意见和建议等可以使用navigator.sendBeacon进行请求。
    反馈

三、navigator.sendBeacon的使用

基本语法如下:

navigator.sendBeacon(url, data);
  • url: 是要发送请求的目标地址,可以是相对路径或绝对 URL。
  • data: 是要发送的数据,可以是字符串、ArrayBuffer 或 Blob。

navigator.sendBeacon 方法发送的请求是 POST 请求,并且请求头中会自动添加 Content-Type: application/x-www-form-urlencoded。

需要发送JSON格式的数据的时候,可以使用Blob进行包装从而发送JSON数据

let data = {name:"smz"}
let blob = new Blob([JSON.stringify(data)],{type:'application/json; charset=UTF-8'})

四、用户停留时间埋点

当打开页面时记录时间,在页面销毁的时候记录时间,这样就得到了用户停留时间,再通过navigator.sendBeacon进行上报用户名、时间、页面等信息完成数据的统计。

前端:

const reportData = () =>{
    //统计停留时间
    let startTime = performance.now(); // 进入页面的时间点
    let logVisit = async function() {
        if (!navigator.sendBeacon) return false;

        const endTime = performance.now(); // 页面卸载的时间点

        let data = new FormData();
        const reportDataList = {
            name: 'smz',
            page: 'home',
            stayTime: ((endTime - startTime)/60000).toFixed(2) + '分钟' // 用户停留时间
        };
        let time = new Blob([JSON.stringify(reportDataList)],{type:'application/json; charset=UTF-8'})
        navigator.sendBeacon("http://localhost:3001/api/b", time);
    };
    window.addEventListener("beforeunload", logVisit);
}
reportData()

后端:这里使用node

const express = require('express')
const app = express()

app.use((req, res, next) => {
    res.setHeader('Access-Control-Allow-Origin', 'http://localhost:63342');
    res.setHeader('Access-Control-Allow-Credentials', true);
    res.setHeader("Access-Control-Allow-Headers", "Content-Type,XFILENAME,XFILECATEGORY,XFILESIZE");
    next();
});

// 解析req.body中的内容
app.use(express.text())
// 心跳包
app.post('/api/heartbeat',(req,res)=>{
    console.log(req.body)
    res.send('ok')
})

// 解析req.body中的内容
app.use(express.json())

// navigator.sendBeacon
app.post('/api/b',(req,res)=>{
    console.log(req.body)
    res.send('ok')
})

app.listen(3001,()=>{
    console.log('server is running')
})

用户停留时间埋点


总结

总之,navigator.sendBeacon 是一个方便的浏览器 API,用于在页面卸载或关闭时发送异步请求,适用于发送统计数据、日志记录、表单提交等场景。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Xray联动burp进行渗透测试

与 Burp 联动 - xray 安全评估工具文档 这是Xray的官方文档 Xray的被动扫描发送的流量比较小,Xray可以联动burp suite 使用,将burp抓到的包发给Xray,我们只需要配置好代理一直点就行,然后查看渗透测试报告 xray_windows_amd64.e…

YOLOv5算法改进(3)— 注意力机制介绍(ECA、SOCA和SimAM)

前言:Hello大家好,我是小哥谈。注意力机制是近年来深度学习领域内的研究热点,可以帮助模型更好地关注重要的特征,从而提高模型的性能。注意力机制可被应用于模型的不同层级,以便更好地捕捉图像中的细节和特征,这种模型在计算资源有限的情况下,可以实现更好的性能和效率。…

vulnhub_Fowsniff靶机渗透测试

Fowsniff靶机 靶机地址:https://www.vulnhub.com/entry/fowsniff-1,262/ 文章目录 Fowsniff靶机信息收集web渗透密码碰撞POP3邮件服务器渗透获取权限权限提升靶机总结 信息收集 通过nmap扫描,靶机开放22 80 110 143端口,110是pop3邮件服务…

京东运营数据分析:2023年8月京东宠物主粮行业品牌销售排行榜

鲸参谋监测的京东平台8月份宠物主粮市场销售数据已出炉! 随着养宠人群的逐渐增多,宠物经济规模也进一步庞大。宠物生活市场中,宠物主粮作为养宠人群的刚需品,其市场规模也在进一步扩大。鲸参谋数据显示,今年8月份&…

如何将中文翻译成日语:文件批量重命名的有效方法

随着全球化的发展,多语言交流变得越来越重要。在许多情况下,我们需要将中文文件翻译成日语,以便更好地进行国际交流。在这个过程中,文件重命名是一种非常有效的技巧,可以帮助我们更快、更准确地完成翻译任务。本文将介…

南美乌拉圭市场最全分析开发攻略,收藏一篇就够了

乌拉圭国家虽小,但是消费能力是不低的,也是南美南美最富的国家之一。中国是乌拉圭第一大贸易伙伴,乌拉圭公民对中国及中国的商品好感度较高,2022年初,中国-乌拉圭海关AEO互认,为中乌经贸合作发展注入了新动…

【Spring AOP】统一用户登录校验

统一用户登录校验 一. 使用拦截器实现统一用户登录校验1. 自定义拦截器2. 将拦截器加入到系统配置 二. 拦截器实现原理三. 扩展:统一访问前缀添加 一. 使用拦截器实现统一用户登录校验 Spring 中提供了具体的实现拦截器:HandlerInterceptor,…

【计算机系统】校验码

【计算机系统】校验码 校验码奇偶校验码海明码校验位的位数校验位的位置确定校验的值校验错误检测 循环冗余校验码 校验码 计算机系统运行时,为了确保数据在传送过程中正确无误,一是提高硬件电路的可靠性,二是提高代码的校验能力。通常使用校…

使用telnet+nc工具测试网络连通性

背景: 正常情况下使用ping命令即可测试网络的连通性,但如果做了内网穿透(端口转发),则需要指定网络端口,此时ping命令无法实现ipport的连通性测试。则可以使用telnetnc测试网络连通性。 环境: 两台服务器都是按照的De…

【Spring AOP】统一异常处理

统一异常处理 统⼀异常处理使⽤的是 ControllerAdvice ExceptionHandler 来实现的, 类上面加上 ControllerAdvice 注解表示控制器通知类方法上面加上 ExceptionHandler 表示异常处理器,并添加异常返回的业务代码 两个结合表示当出现异常的时候执⾏某个…

一文带你简单了解一下堡垒机是干嘛的!

随着国家对网络安全的重视,随着等保政策的落地执行,越来越多的企业知道了堡垒机。但对于堡垒机的作用还不是很了解,很多人在问,堡垒机是干嘛的、这里我们小编就跟大家来简单唠唠。 首先我们来看看什么是堡垒机? 堡垒…

VBA入门3——过程和函数 (Sub | Function)

VBA基础入门2 VBA 过程和函数 (Sub | Function)VBA 过程(Sub) 入门教程和实例(组织代码的容器)无参数过程有参数过程调用子过程(Sub)调用子过程和函数的基本语法提前退出过程 VBA 函数(Function)入门教程和实例(重复使…

Cookies Session JWT

Cookies Cookies是会话跟踪技术的一种,通过将数据保存到客户端的浏览器上以此来达到会话间共享数据的效果。 从打开浏览器开始访问页面直到关闭浏览器断开连接算作一次会话(Session),一次会话中可以包含多次请求-响应。每次的请…

【linux】权限相关问题

【linux】权限相关问题 一.用户的分类sudo 二.文件执行的权限i. 文件的分类ii.人的分类三.修改创建文件的权限chmod更改文件创造的默认权限(umask) 三.删除(粘滞位) 一.用户的分类 在我们使用linux的时候,有用户类型的区分,不同用…

Linux环境下Qt应用程序打包与发布

本文介绍Linux环境下Qt应用程序的打包与发布。 Linux环境下,在开发机器上开发完应用程序,需要部署到其他非开发环境的机器上,这时,需要对开发的Qt应用程序进行打包,以确保可以在其他机器平台(非开发环境&a…

20231012_python练习_服务端与客户端数据交互v2_增加xlsx表格数据批量导入数据库

服务端增加根据上传附件格式 xlsx 类型,将表格第一个sheet数据批量快速导入数据库 服务端 import socketserver import json import os #import pymysql import cx_Oracle #Oracle 数据库连接 import time import tqdm import pandas as pd import openpyxlclass …

Linux---(二)基本认识与安装

文章目录 前言一、操作系统的概念、定位二、使用XShell远程登录Linux1.下载安装XShell2.查看 Linux 主机 ip3.使用XShell登录主机4.XShell 下的复制粘贴 前言 一、操作系统的概念、定位 1.操作系统是一款进行软硬件资源管理的软件 硬件资源管理:将CPU、键盘、显示…

uni-app:本地缓存的使用

uni-app 提供了多种方法用于本地缓存的操作。下面是一些常用的 uni-app 本地缓存方法: uni.setStorageSync(key, data): 同步方式将数据存储到本地缓存中,可以使用对应的 key 来获取该数据。 uni.setStorage({key, data}): 异步方式将数据存储到本地缓存…

Leetcode: 931.下降路径最小和(动态规划)

1. 题目解析 LeetCode链接 根据题目可以得出,当处于 [i][j] 位置时只能从 [i - 1][j - 1],[i - 1][j],[i - 1][j 1] 这三个位置到达, 所以我们想要得到当前最小的路径和只需要得到上述三个位置的最小值加上该位置的值即可。 2…

Redis(五)

文章目录 一、Redis键值设计(一)key结构设计(二)拒绝BigKey什么是BigKey?BigKey的危害如何发现BigKey (一)恰当的数据类型 二、批处理优化三、服务端优化四、集群最佳实践 一、Redis键值设计 &…