跳到主要内容

AI 聊天匿名访问限流配置

AI 助手聊天接口(/airag/chat/send/airag/chat/upload)默认允许匿名访问。为防止接口被恶意刷取导致 LLM API 额度被盗用,JeecgBoot 内置了基于 Redis 的固定窗口限流保护。

v3.9.5+:匿名访问还需携带应用发布时生成的 shareToken(见 AI应用 - 发布)。限流与分享令牌相互配合:令牌控制“能否访问该应用”,限流控制“访问频率”。

生效范围

限流仅针对以下两个匿名接口生效:

接口请求方式限流维度
/airag/chat/sendPOST/GET每会话每分钟、每 IP 每分钟
/airag/chat/uploadPOST每会话每小时、每 IP 每小时

说明:限流在接口入口处执行,触发后后端会向前端返回 SSE ERROR 事件,前端会提示用户“发送消息过于频繁,请稍后再试”或“上传文件过于频繁,请稍后再试”。

配置项

application-dev.yml(或其他环境对应的 yml)中增加 jeecg.airag.rate-limit 配置:

jeecg:
airag:
rate-limit:
# 每会话每分钟最多发送消息次数
send-per-session-per-minute: 20
# 每 IP 每分钟最多发送消息次数
send-per-ip-per-minute: 60
# 每会话每小时最多上传文件次数
upload-per-session-per-hour: 20

配置项说明

配置项默认值说明
send-per-session-per-minute20单个会话(浏览器 session)每分钟最多调用 /airag/chat/send 的次数
send-per-ip-per-minute60单个 IP 每分钟最多调用 /airag/chat/send 的次数
upload-per-session-per-hour20单个会话每小时最多调用 /airag/chat/upload 的次数

提示:默认值兼顾了正常用户体验与基础防护能力。如果部署环境面向公网、匿名访问较多,可适当调低;如果是内网使用且用户量小,可适当调高。

实现类

限流逻辑位于后端源码:

jeecg-boot-module/jeecg-boot-module-airag/src/main/java/org/jeecg/modules/airag/app/service/impl/AiragChatRateLimitService.java
  • 使用 RedisTemplate 固定窗口计数。
  • Redis key 按 airag:rate:{type}:{维度}:{时间窗口} 组织,并设置过期时间。
  • 触发限流时抛出 JeecgBootException,由 AiragChatController 转换为 SSE ERROR 事件返回前端。

注意事项

  1. 必须启用 Redis:限流依赖 Redis 计数,若 Redis 不可用则限流失效。
  2. IP 维度存在 NAT 共享问题:公司内网、代理出口等场景下多个用户可能共享同一个公网 IP,send-per-ip-per-minute 不宜设置过低。
  3. 提示语不暴露阈值:前端提示仅说明“过于频繁”,不会显示具体限制数值,避免被攻击者利用。
  4. 配置修改后需重启后端服务生效。