AI 聊天匿名访问限流配置
AI 助手聊天接口(/airag/chat/send、/airag/chat/upload)默认允许匿名访问。为防止接口被恶意刷取导致 LLM API 额度被盗用,JeecgBoot 内置了基于 Redis 的固定窗口限流保护。
v3.9.5+:匿名访问还需携带应用发布时生成的
shareToken(见 AI应用 - 发布)。限流与分享令牌相互配合:令牌控制“能否访问该应用”,限流控制“访问频率”。
生效范围
限流仅针对以下两个匿名接口生效:
| 接口 | 请求方式 | 限流维度 |
|---|---|---|
/airag/chat/send | POST/GET | 每会话每分钟、每 IP 每分钟 |
/airag/chat/upload | POST | 每会话每小时、每 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-minute | 20 | 单个会话(浏览器 session)每分钟最多调用 /airag/chat/send 的次数 |
send-per-ip-per-minute | 60 | 单个 IP 每分钟最多调用 /airag/chat/send 的次数 |
upload-per-session-per-hour | 20 | 单个会话每小时最多调用 /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转换为 SSEERROR事件返回前端。
注意事项
- 必须启用 Redis:限流依赖 Redis 计数,若 Redis 不可用则限流失效。
- IP 维度存在 NAT 共享问题:公司内网、代理出口等场景下多个用户可能共享同一个公网 IP,
send-per-ip-per-minute不宜设置过低。 - 提示语不暴露阈值:前端提示仅说明“过于频繁”,不会显示具体限制数值,避免被攻击者利用。
- 配置修改后需重启后端服务生效。