277 lines
6.8 KiB
Markdown
277 lines
6.8 KiB
Markdown
|
|
# 移除限流功能完成
|
|||
|
|
|
|||
|
|
## ✅ 已完成的工作
|
|||
|
|
|
|||
|
|
已成功移除项目中所有的限流功能(`@RateLimit` 注解)。
|
|||
|
|
|
|||
|
|
## 📝 修改的文件
|
|||
|
|
|
|||
|
|
### 1. `backend/src/main/java/com/peidu/controller/AuthController.java`
|
|||
|
|
|
|||
|
|
#### 修改1: 登录接口
|
|||
|
|
**位置**: 第42-43行
|
|||
|
|
|
|||
|
|
**修改前**:
|
|||
|
|
```java
|
|||
|
|
@PostMapping("/login")
|
|||
|
|
@RateLimit(limitType = RateLimit.LimitType.IP, permitsPerSecond = 5, message = "登录过于频繁,请稍后再试")
|
|||
|
|
@OperationLog(module = "认证", type = OperationLog.OperationType.LOGIN, description = "用户登录", saveParams = false)
|
|||
|
|
public Result<Map<String, Object>> login(@RequestBody LoginRequest request) {
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**修改后**:
|
|||
|
|
```java
|
|||
|
|
@PostMapping("/login")
|
|||
|
|
@OperationLog(module = "认证", type = OperationLog.OperationType.LOGIN, description = "用户登录", saveParams = false)
|
|||
|
|
public Result<Map<String, Object>> login(@RequestBody LoginRequest request) {
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 修改2: 发送验证码接口
|
|||
|
|
**位置**: 第441-442行
|
|||
|
|
|
|||
|
|
**修改前**:
|
|||
|
|
```java
|
|||
|
|
@PostMapping("/send-code")
|
|||
|
|
@RateLimit(limitType = RateLimit.LimitType.IP, permitsPerSecond = 0.0167, message = "验证码发送过于频繁,请1分钟后再试")
|
|||
|
|
public Result<?> sendCode(@RequestBody SendCodeRequest request) {
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**修改后**:
|
|||
|
|
```java
|
|||
|
|
@PostMapping("/send-code")
|
|||
|
|
public Result<?> sendCode(@RequestBody SendCodeRequest request) {
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 2. `backend/src/main/java/com/peidu/controller/ProviderController.java`
|
|||
|
|
|
|||
|
|
#### 修改1: 服务商注册申请
|
|||
|
|
**位置**: 第169行
|
|||
|
|
|
|||
|
|
**修改前**:
|
|||
|
|
```java
|
|||
|
|
@PostMapping("/apply")
|
|||
|
|
@RateLimit(limitType = RateLimit.LimitType.USER, permitsPerSecond = 0.01, message = "申请过于频繁,请稍后再试")
|
|||
|
|
public Result<Void> apply(
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**修改后**:
|
|||
|
|
```java
|
|||
|
|
@PostMapping("/apply")
|
|||
|
|
public Result<Void> apply(
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 修改2: 发布课程
|
|||
|
|
**位置**: 第307行
|
|||
|
|
|
|||
|
|
**修改前**:
|
|||
|
|
```java
|
|||
|
|
@PostMapping("/course/publish")
|
|||
|
|
@RateLimit(limitType = RateLimit.LimitType.USER, permitsPerSecond = 0.1, message = "发布过于频繁")
|
|||
|
|
public Result<Void> publishCourse(
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**修改后**:
|
|||
|
|
```java
|
|||
|
|
@PostMapping("/course/publish")
|
|||
|
|
public Result<Void> publishCourse(
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 修改3: 签到核销
|
|||
|
|
**位置**: 第763行
|
|||
|
|
|
|||
|
|
**修改前**:
|
|||
|
|
```java
|
|||
|
|
@PostMapping("/checkin")
|
|||
|
|
@RateLimit(limitType = RateLimit.LimitType.USER, permitsPerSecond = 0.1, message = "操作过于频繁")
|
|||
|
|
public Result<Void> checkin(@RequestBody CheckInRequest request) {
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**修改后**:
|
|||
|
|
```java
|
|||
|
|
@PostMapping("/checkin")
|
|||
|
|
public Result<Void> checkin(@RequestBody CheckInRequest request) {
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 修改4: 申请提现
|
|||
|
|
**位置**: 第1013行
|
|||
|
|
|
|||
|
|
**修改前**:
|
|||
|
|
```java
|
|||
|
|
@PostMapping("/withdraw/apply")
|
|||
|
|
@RateLimit(limitType = RateLimit.LimitType.USER, permitsPerSecond = 0.01, message = "提现申请过于频繁")
|
|||
|
|
public Result<Void> applyWithdraw(
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**修改后**:
|
|||
|
|
```java
|
|||
|
|
@PostMapping("/withdraw/apply")
|
|||
|
|
public Result<Void> applyWithdraw(
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 修改统计
|
|||
|
|
|
|||
|
|
| 文件 | 移除数量 | 接口 |
|
|||
|
|
|------|----------|------|
|
|||
|
|
| AuthController.java | 2个 | 登录、发送验证码 |
|
|||
|
|
| ProviderController.java | 4个 | 注册申请、发布课程、签到核销、申请提现 |
|
|||
|
|
| **总计** | **6个** | - |
|
|||
|
|
|
|||
|
|
## 🔍 验证
|
|||
|
|
|
|||
|
|
已确认没有遗漏的 `@RateLimit` 注解(除了已注释的注册接口)。
|
|||
|
|
|
|||
|
|
## ⚠️ 注意事项
|
|||
|
|
|
|||
|
|
### 1. 限流相关代码仍然存在
|
|||
|
|
|
|||
|
|
以下文件仍然存在,但不会被使用:
|
|||
|
|
- `backend/src/main/java/com/peidu/aspect/RateLimitAspect.java` - 限流切面
|
|||
|
|
- `backend/src/main/java/com/peidu/config/RateLimitConfig.java` - 限流配置
|
|||
|
|
- `backend/src/main/java/com/peidu/annotation/RateLimit.java` - 限流注解
|
|||
|
|
|
|||
|
|
**建议**: 如果确定不需要,可以删除这些文件。
|
|||
|
|
|
|||
|
|
### 2. 依赖仍然存在
|
|||
|
|
|
|||
|
|
`pom.xml` 中的 Guava 依赖仍然存在:
|
|||
|
|
```xml
|
|||
|
|
<dependency>
|
|||
|
|
<groupId>com.google.guava</groupId>
|
|||
|
|
<artifactId>guava</artifactId>
|
|||
|
|
</dependency>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**建议**: 如果项目其他地方不使用 Guava,可以移除此依赖。
|
|||
|
|
|
|||
|
|
### 3. 安全考虑
|
|||
|
|
|
|||
|
|
移除限流后,接口可能面临以下风险:
|
|||
|
|
- ⚠️ 暴力破解攻击
|
|||
|
|
- ⚠️ 短信轰炸
|
|||
|
|
- ⚠️ 恶意注册
|
|||
|
|
- ⚠️ DDoS 攻击
|
|||
|
|
|
|||
|
|
**建议**:
|
|||
|
|
- 在生产环境使用 Nginx 或 API 网关进行限流
|
|||
|
|
- 使用验证码保护敏感接口
|
|||
|
|
- 监控异常请求
|
|||
|
|
|
|||
|
|
## 🔄 下一步操作
|
|||
|
|
|
|||
|
|
### 必须操作: 重启后端服务
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 方法1: 使用脚本
|
|||
|
|
.\重启后端服务.bat
|
|||
|
|
|
|||
|
|
# 方法2: 手动重启
|
|||
|
|
cd backend
|
|||
|
|
mvn clean package -DskipTests
|
|||
|
|
java -jar target/peidu-backend-1.0.0.jar
|
|||
|
|
|
|||
|
|
# 方法3: IDEA 中重启
|
|||
|
|
# 点击红色方块停止,然后点击绿色三角重新运行
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 可选操作: 清理限流相关代码
|
|||
|
|
|
|||
|
|
如果确定不需要限流功能,可以删除以下文件:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 删除限流相关文件
|
|||
|
|
rm backend/src/main/java/com/peidu/aspect/RateLimitAspect.java
|
|||
|
|
rm backend/src/main/java/com/peidu/config/RateLimitConfig.java
|
|||
|
|
rm backend/src/main/java/com/peidu/annotation/RateLimit.java
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🧪 测试验证
|
|||
|
|
|
|||
|
|
### 1. 重启服务后测试
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 测试登录接口(可以快速连续请求)
|
|||
|
|
curl -X POST http://localhost:8089/api/auth/login \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d '{
|
|||
|
|
"phone": "13800138000",
|
|||
|
|
"password": "123456"
|
|||
|
|
}'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 预期结果
|
|||
|
|
|
|||
|
|
- ✅ 不会出现"登录过于频繁"错误
|
|||
|
|
- ✅ 可以快速连续请求
|
|||
|
|
- ✅ 所有接口正常响应
|
|||
|
|
|
|||
|
|
### 3. 在小程序中测试
|
|||
|
|
|
|||
|
|
1. 打开登录页面
|
|||
|
|
2. 点击"一键登录"
|
|||
|
|
3. 应该能正常登录,不会有任何限流提示
|
|||
|
|
|
|||
|
|
## 📋 完成清单
|
|||
|
|
|
|||
|
|
- [x] 移除 AuthController 中的限流注解(2个)
|
|||
|
|
- [x] 移除 ProviderController 中的限流注解(4个)
|
|||
|
|
- [x] 验证没有遗漏的限流注解
|
|||
|
|
- [ ] 重启后端服务(需要手动执行)
|
|||
|
|
- [ ] 测试验证(需要手动执行)
|
|||
|
|
- [ ] 清理限流相关代码(可选)
|
|||
|
|
- [ ] 移除 Guava 依赖(可选)
|
|||
|
|
|
|||
|
|
## 🎯 影响的接口
|
|||
|
|
|
|||
|
|
移除限流后,以下接口不再有请求频率限制:
|
|||
|
|
|
|||
|
|
### AuthController
|
|||
|
|
1. `POST /api/auth/login` - 用户登录
|
|||
|
|
2. `POST /api/auth/send-code` - 发送验证码
|
|||
|
|
|
|||
|
|
### ProviderController
|
|||
|
|
3. `POST /api/provider/apply` - 服务商注册申请
|
|||
|
|
4. `POST /api/provider/course/publish` - 发布课程
|
|||
|
|
5. `POST /api/provider/checkin` - 签到核销
|
|||
|
|
6. `POST /api/provider/withdraw/apply` - 申请提现
|
|||
|
|
|
|||
|
|
## 💡 替代方案
|
|||
|
|
|
|||
|
|
如果将来需要限流保护,可以考虑:
|
|||
|
|
|
|||
|
|
### 1. Nginx 限流
|
|||
|
|
```nginx
|
|||
|
|
limit_req_zone $binary_remote_addr zone=login:10m rate=10r/s;
|
|||
|
|
|
|||
|
|
location /api/auth/login {
|
|||
|
|
limit_req zone=login burst=5;
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. API 网关限流
|
|||
|
|
使用 Spring Cloud Gateway、Kong 等 API 网关的限流功能
|
|||
|
|
|
|||
|
|
### 3. 应用层限流
|
|||
|
|
使用 Redis + Lua 脚本实现分布式限流
|
|||
|
|
|
|||
|
|
### 4. 验证码保护
|
|||
|
|
在敏感接口添加验证码验证
|
|||
|
|
|
|||
|
|
## 🎉 总结
|
|||
|
|
|
|||
|
|
- ✅ 已成功移除所有限流功能
|
|||
|
|
- ✅ 修改了2个文件,共6处
|
|||
|
|
- ✅ 不会再出现"过于频繁"的错误
|
|||
|
|
- ⚠️ 需要重启后端服务才能生效
|
|||
|
|
- ⚠️ 生产环境建议使用其他方式保护接口
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**修改时间**: 2026-02-03
|
|||
|
|
**修改文件**: 2个
|
|||
|
|
**移除注解**: 6个
|
|||
|
|
**状态**: ✅ 已完成,待重启服务
|