当前位置:首页 > 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
分享给朋友:

相关文章

jquery.js

jquery.js

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互等操作。以下是关于 jQuery.js 的核心信息和使用方法: 获…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

js 实现递归

js 实现递归

递归的基本概念 递归是指函数直接或间接调用自身的过程。在JavaScript中,递归通常用于解决可以分解为相似子问题的问题,如阶乘、斐波那契数列、树形结构遍历等。 递归的实现要点 基线条件(Base…

js 实现日历

js 实现日历

实现日历的基本思路 日历的核心功能是展示日期,并允许用户进行日期选择或导航。JavaScript 可以动态生成日历的 HTML 结构,并处理用户交互逻辑。 基础日历结构 日历通常包含头部(显示月份和…

js 实现mvc

js 实现mvc

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

js实现选择目录

js实现选择目录

在JavaScript中实现选择目录的功能通常需要结合浏览器API或第三方库,以下是几种常见方法: 使用 <input type="file"> 的 webkitdirectory 属性…