SpringBoot 接口访问频率限制
在Spring Boot中,我们可以使用Spring Security和Redis来实现接口访问频率的限制。以下是一个简单的示例,演示如何限制特定接口的访问频率。
首先,添加依赖到你的pom.xml
:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
然后,配置Redis和Security:
@Configuration
public class RedisRateLimiterConfig {
@Autowired
private ReactiveRedisTemplate<String, Long> redisTemplate;
@Bean
public KeyResolver keyResolver() {
return exchange -> Mono.just(exchange.getRequest().getPath().value());
}
@Bean
public RedisRateLimiter redisRateLimiter() {
return new RedisRateLimiter(redisTemplate, "rateLimiter", 1, 2, ChronoUnit.SECONDS);
}
}
@Configuration
public class SecurityConfig {
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
http
.authorizeExchange()
.pathMatchers("/api/protected").hasRole("USER")
.anyExchange().permitAll()
.and()
.httpBasic()
.and()
.addFilterAtStart(new RedisRateLimiterWebFilter(redisRateLimiter()), SecurityWebFiltersOrder.RATE_LIMITER)
.csrf().disable();
return http.build();
}
@Bean
public MapReactiveUserDetailsService reactiveUserDetailsService() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new MapReactiveUserDetailsService(user);
}
}
在上述配置中,我们定义了一个RedisRateLimiterConfig
,其中创建了一个RedisRateLimiter
bean,并指定了最大访问次数(1次)和时间窗口(2秒)。SecurityConfig
中配置了Spring Security,并添加了一个RedisRateLimiterWebFilter
作为安全链的开始,限制对/api/protected
路径的访问频率。
这样配置后,任何尝试在2秒内多次访问/api/protected
的请求都将被限流。需要注意的是,这个例子使用了Spring Security的基本认证,实际应用中应该根据具体需求进行认证和授权配置。
评论已关闭