点击上方“程序员蜗牛g”,选择“设为星标”跟蜗牛哥一起,每天进步一点点
程序员蜗牛g大厂程序员一枚 跟蜗牛一起 每天进步一点点31篇原创内容**公众号
在当今互联网应用场景中,接口被恶意刷流量或攻击已成常态。
本文将带你深入理解 SpringBoot 3 中 接口防刷的 8 大实战解决方案,助你轻松构建稳定、安全的微服务系统。
1. Nginx 级别限流(推荐作为第一道防线)
2. 基于拦截器+Redis 实现接口限流
核心思想:
3. Google Guava + 本地缓存限流
- Sentinel 接口防刷利器(推荐)
阿里开源的 Sentinel 是一个功能强大且灵活的限流熔断组件,支持控制台可视化配置、动态扩展和多种限流策略。
⭐ 常见限流维度:
- QPS(每秒请求数)限流
- 并发线程数限流
- 热点参数限流(针对热门资源限流)
- 关联限流(资源间依赖控制)
- 链路限流(不同入口资源独立统计)
1️⃣ 引入依赖:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-annotation-aspectj</artifactId>
</dependency>
2️⃣ 控制台部署(推荐配置持久化)
下载控制台 jar:
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -jar sentinel-dashboard.jar
3️⃣ 注解式限流使用:
@SentinelResource(value = "hello", blockHandler = "handleBlock")@GetMapping("/hello")public String hello() { return "Hello Sentinel";}
public String handleBlock(BlockException ex) { return "被限流了!";}
4️⃣ 编程式限流:
try (Entry entry = SphU.entry("order-service")) {
// 业务逻辑
} catch (BlockException ex) {
// 限流处理逻辑
}
5️⃣ 高级玩法:
- 配合 Nacos 实现规则持久化
- 自定义资源路径解析器,按用户或 IP 限流
WebCallbackManager.setUrlCleaner(url -> {
// 统一 URL 资源名,避免 path 变量被当成不同资源
return url.replaceAll("/user/\d+", "/user/*");
});
优点: 功能强大、集成简单、支持动态化
缺点: 依赖 Sentinel 控制台,需配置持久化规则
5. 验证码拦截(强验证方式防刷)
验证码机制适用于注册/登录等关键接口,阻止自动脚本攻击。
Easy-Captcha 使用示例:
1️⃣ 添加依赖:
<dependency>
<groupId>com.github.whvcse</groupId>
<artifactId>easy-captcha</artifactId>
<version>1.6.2</version>
</dependency>
生成验证码:
@GetMapping("/captcha")public void getCaptcha(HttpServletRequest request, HttpServletResponse response) throws IOException { ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(150, 40, 4, 4); String text = captcha.getCode();
String captchaId = UUID.randomUUID().toString(); redisTemplate.opsForValue().set("captcha:" + captchaId, text, 5, TimeUnit.MINUTES);
Cookie cookie = new Cookie("captchaId", captchaId); response.addCookie(cookie); response.setContentType("image/png"); captcha.write(response.getOutputStream());}
登录时验证:
@PostMapping("/login")public String login(@RequestParam String code, @CookieValue("captchaId") String captchaId) { String redisCode = redisTemplate.opsForValue().get("captcha:" + captchaId); if (!code.equalsIgnoreCase(redisCode)) { throw new RuntimeException("验证码错误"); } // 登录逻辑}
优点: 防止脚本攻击,兼容用户行为分析
缺点: 用户体验稍差,不适合频繁调用接口
6. 接入滑块验证码/行为验证码(如腾讯滑块)
用于注册、投票等关键行为,需 JS SDK 支持,推荐服务:
- 极验(geetest)
- 腾讯云验证码(支持行为识别)
7. IP 白名单拦截机制
适用于对内系统、支付回调接口等,防止非授权来源访问。
示例:
List<String> whiteIps = Arrays.asList("127.0.0.1", "192.168.1.1");
if (!whiteIps.contains(request.getRemoteAddr())) { response.setStatus(403); response.getWriter().write("非法访问");}
8. 用户行为分析+风控(智能防刷)
适用于大中型系统,配合日志采集系统(如 ELK)+ 用户行为画像 + 可疑行为预警。
- 异常行为:频繁点击、访问路径异常、接口秒级访问
- 数据支撑:埋点日志分析 + 机器学习模型判断
常见方案:
- 接入 OpenTelemetry / Skywalking 做链路追踪
- 建立行为模型识别“异常访问轨迹”
总结对比表:
结论:
如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、转发、在看。
关注公众号:woniuxgg,在公众号中回复:笔记 就可以获得蜗牛为你精心准备的java实战语雀笔记,回复面试、开发手册、有超赞的粉丝福利!