当前位置:首页 > JavaScript

js实现防洪

2026-02-28 19:26:52JavaScript

实现防洪功能的JavaScript方法

防洪(Flood Control)通常指在Web应用中防止用户短时间内频繁提交请求或操作,例如重复点击按钮、恶意刷接口等。以下是几种常见的实现方式:

防抖(Debounce)

防抖确保在事件触发后延迟执行回调,若在延迟期间再次触发则重新计时。适用于输入框搜索联想等场景。

js实现防洪

function debounce(func, delay) {
  let timer;
  return function(...args) {
    clearTimeout(timer);
    timer = setTimeout(() => func.apply(this, args), delay);
  };
}

// 使用示例
const searchInput = document.getElementById('search');
searchInput.addEventListener('input', debounce(function() {
  console.log('发送搜索请求');
}, 500));

节流(Throttle)

节流规定在单位时间内最多执行一次回调。适用于滚动事件、按钮频繁点击等场景。

js实现防洪

function throttle(func, interval) {
  let lastTime = 0;
  return function(...args) {
    const now = Date.now();
    if (now - lastTime >= interval) {
      func.apply(this, args);
      lastTime = now;
    }
  };
}

// 使用示例
const button = document.getElementById('submit');
button.addEventListener('click', throttle(function() {
  console.log('提交表单');
}, 1000));

请求锁(Request Lock)

通过标志位或Promise状态锁定请求,避免并发重复提交。

let isSubmitting = false;

async function handleSubmit() {
  if (isSubmitting) return;
  isSubmitting = true;

  try {
    await fetch('/api/submit', { method: 'POST' });
  } finally {
    isSubmitting = false;
  }
}

令牌桶算法(Token Bucket)

高级限流算法,控制请求速率。适用于API调用限制。

class TokenBucket {
  constructor(capacity, fillRate) {
    this.capacity = capacity;
    this.tokens = capacity;
    this.fillRate = fillRate; // 令牌/毫秒
    this.lastTime = Date.now();
  }

  consume(tokens = 1) {
    this.refill();
    if (this.tokens >= tokens) {
      this.tokens -= tokens;
      return true;
    }
    return false;
  }

  refill() {
    const now = Date.now();
    const delta = (now - this.lastTime) * this.fillRate;
    this.tokens = Math.min(this.capacity, this.tokens + delta);
    this.lastTime = now;
  }
}

// 使用示例
const bucket = new TokenBucket(10, 0.001); // 10令牌,每秒补充1个
setInterval(() => {
  if (bucket.consume()) {
    console.log('允许请求');
  } else {
    console.log('请求被限流');
  }
}, 100);

实际应用建议

  • 前端防抖/节流:减少无效请求,提升用户体验。
  • 后端验证:前端防护可绕过,需结合后端限流(如Redis计数器)。
  • HTTP状态码:返回429(Too Many Requests)明确限流状态。

通过组合上述方法,可有效实现不同场景下的防洪需求。

标签: js
分享给朋友:

相关文章

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…

js画图实现

js画图实现

使用Canvas API绘制图形 Canvas是HTML5提供的绘图API,通过JavaScript操作Canvas元素可以绘制各种图形。以下是一个简单的示例: <canvas id="myC…

js实现排序

js实现排序

数组排序方法 JavaScript提供了内置的sort()方法用于数组排序。默认情况下,sort()将元素转换为字符串并按照Unicode码点排序。对于数字排序,需传入比较函数。 const num…

js 实现mvc

js 实现mvc

MVC 模式简介 MVC(Model-View-Controller)是一种软件设计模式,将应用程序分为三个核心组件:模型(Model)处理数据和业务逻辑,视图(View)负责展示数据,控制器(Con…