当前位置:首页 > 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实现轮播

实现基础轮播效果 使用HTML结构创建轮播容器和图片元素: <div class="carousel"> <div class="carousel-inner">…

jquery.js

jquery.js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,用于简化 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它的设计宗旨是“Write Less, Do Mor…

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…