SpringBoot 拦截器限流方案 - 基于 Redis 实现
在 Spring Boot 中,可以通过实现 HandlerInterceptor 接口来实现拦截器,用于在请求进入 Controller 之前或之后对请求进行拦截和处理。在拦截器中,可以通过各种手段对请求进行限流,下面介绍一种基于 Redis 的限流方案。
首先,需要在 pom.xml 中引入 Redis 相关依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
然后,创建一个 RateLimitInterceptor 类,并实现 HandlerInterceptor 接口。在 preHandle 方法中,使用 Redis 的 incr 方法对当前请求的 IP 地址进行计数,并将计数结果与预设的阈值进行比较。如果计数结果超过阈值,则返回 false,表示请求被限流。
public class RateLimitInterceptor implements HandlerInterceptor {
private RedisTemplate<String, Object> redisTemplate;
public RateLimitInterceptor(RedisTemplate<String, Object> redisTemplate) {
this.redisTemplate = redisTemplate;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String ip = request.getRemoteAddr();
String key = 'rate_limit:' + ip;
Long count = redisTemplate.opsForValue().increment(key, 1);
if (count != null && count > 10) {
response.getWriter().write('请求过于频繁,请稍后再试!');
return false;
}
return true;
}
// 在 afterCompletion 方法中清除计数器
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
String ip = request.getRemoteAddr();
String key = 'rate_limit:' + ip;
redisTemplate.delete(key);
}
}
最后,在 WebMvcConfigurer 中注册拦截器:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
private RedisTemplate<String, Object> redisTemplate;
public WebMvcConfig(RedisTemplate<String, Object> redisTemplate) {
this.redisTemplate = redisTemplate;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new RateLimitInterceptor(redisTemplate)).addPathPatterns('/**');
}
}
这样,就完成了基于 Redis 的拦截器限流方案。当同一个 IP 地址的请求次数超过预设的阈值时,就会被限流。
原文地址: https://www.cveoy.top/t/topic/lKaR 著作权归作者所有。请勿转载和采集!