在 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 地址的请求次数超过预设的阈值时,就会被限流。

SpringBoot 拦截器限流方案 - 基于 Redis 实现

原文地址: https://www.cveoy.top/t/topic/lKaR 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录