SpringBoot實現(xiàn)接口防刷的兩種方法
什么是接口防刷
接口被刷指的是同一接口被頻繁調(diào)用,可能是由于以下原因?qū)е拢?/p>
- 惡意攻擊: 攻擊者利用自動化腳本或工具對接口進行大量請求,以消耗系統(tǒng)資源、拖慢系統(tǒng)響應(yīng)速度或達到其他惡意目的。
- 誤操作或程序錯誤: 某些情況下,程序錯誤或誤操作可能導(dǎo)致接口被重復(fù)調(diào)用,例如循環(huán)調(diào)用或者定時任務(wù)配置錯誤。
常見的接口防刷策略
請求頻率限制:限制單個用戶或IP地址在一定時間內(nèi)能夠發(fā)送請求的次數(shù),防止用戶過度頻繁地發(fā)送請求。
驗證碼驗證:要求用戶在發(fā)送請求之前先進行驗證碼驗證,從而確保該請求是來自真實用戶而不是機器人。
用戶身份認證:要求用戶在發(fā)送請求之前先進行身份認證,例如使用用戶名和密碼進行登錄或使用API密鑰進行身份驗證,從而確保只有合法的用戶可以發(fā)送請求。
動態(tài)令牌:為每個請求生成一個動態(tài)令牌,要求客戶端在請求中附帶該令牌,服務(wù)器端根據(jù)令牌來驗證請求的合法性。
異常行為檢測:通過監(jiān)控用戶的行為和請求模式,檢測異常的請求行為,例如短時間內(nèi)發(fā)送大量請求或者發(fā)送重復(fù)請求等,從而識別和阻止惡意用戶或機器人。
Redis 實現(xiàn)接口防刷
Redis是一種高性能的鍵值存儲系統(tǒng),常用于緩存和分布式鎖等場景。利用Redis可以有效地實現(xiàn)接口防刷功能:
- 計數(shù)器: 利用Redis的計數(shù)器功能,每次接口被調(diào)用時增加計數(shù)器的值,設(shè)定一個時間窗口內(nèi)的最大調(diào)用次數(shù),超過該次數(shù)則拒絕請求。
- 分布式鎖: 利用Redis的分布式鎖功能,確保同一時間只有一個請求能夠增加計數(shù)器的值,防止并發(fā)問題導(dǎo)致計數(shù)器失效。
代碼示例
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.concurrent.TimeUnit;
import javax.annotation.Resource;
@Component
public class RateLimitInterceptor extends HandlerInterceptorAdapter {
@Resource
private RedisTemplate<String, String> redisTemplate;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String ipAddress = request.getRemoteAddr();
String key = "rate_limit:" + ipAddress;
long count = redisTemplate.opsForValue().increment(key, 1);
if (count == 1) {
redisTemplate.expire(key, 1, TimeUnit.MINUTES); // 設(shè)置過期時間,防止數(shù)據(jù)永久存儲
}
if (count > 100) { // 設(shè)置閾值為每分鐘最多100次請求
response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());
response.getWriter().write("請求過于頻繁,請稍后重試");
return false;
}
return true;
}
}
攔截器實現(xiàn)接口防刷
- 編寫攔截器:創(chuàng)建一個實現(xiàn)HandlerInterceptor接口的攔截器類,重寫preHandle方法,在該方法中進行接口調(diào)用次數(shù)的檢查,如果超過閾值則攔截請求。
- 配置攔截器:在Spring Boot的配置類中通過addInterceptor方法將攔截器注冊到攔截器鏈中,配置攔截器的攔截路徑和排除路徑。
代碼示例
使用攔截器實現(xiàn)接口防刷
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class RateLimitInterceptor implements HandlerInterceptor {
private static final int MAX_REQUESTS_PER_MINUTE = 100;
private static final String RATE_LIMIT_KEY_PREFIX = "rate_limit:";
private final RedisTemplate<String, String> redisTemplate;
public RateLimitInterceptor(RedisTemplate<String, String> redisTemplate) {
this.redisTemplate = redisTemplate;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String ipAddress = request.getRemoteAddr();
String key = RATE_LIMIT_KEY_PREFIX + ipAddress;
Long count = redisTemplate.opsForValue().increment(key, 1);
if (count == 1) {
redisTemplate.expire(key, 1, TimeUnit.MINUTES);
}
if (count > MAX_REQUESTS_PER_MINUTE) {
response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());
response.getWriter().write("請求過于頻繁,請稍后重試");
return false;
}
return true;
}
}
攔截器配置
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.annotation.Resource;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
private final RateLimitInterceptor rateLimitInterceptor;
@Autowired
public WebMvcConfig(RateLimitInterceptor rateLimitInterceptor) {
this.rateLimitInterceptor = rateLimitInterceptor;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(rateLimitInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/exclude/**"); // 可以排除一些不需要攔截的路徑
}
}
總結(jié)
接口防刷是保障系統(tǒng)安全和穩(wěn)定性的重要手段,利用Redis和攔截器可以很好地實現(xiàn)接口防刷功能。通過合理設(shè)置閾值和時間窗口,以及監(jiān)控系統(tǒng)日志,可以及時發(fā)現(xiàn)異常情況并采取相應(yīng)措施,確保系統(tǒng)正常運行
以上就是SpringBoot實現(xiàn)接口防刷的兩種方法的詳細內(nèi)容,更多關(guān)于SpringBoot接口防刷的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring Cloud Gateway 默認的filter功能和執(zhí)行順序介紹
這篇文章主要介紹了Spring Cloud Gateway 默認的filter功能和執(zhí)行順序,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10
IDEA創(chuàng)建父項目和子項目的實現(xiàn)步驟
本文主要介紹了IDEA創(chuàng)建父項目和子項目的實現(xiàn)步驟,文中通過圖文介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2024-07-07
Java和Rust實現(xiàn)JSON序列化互轉(zhuǎn)的解決方案詳解
這篇文章主要為大家詳細介紹了Java和Rust實現(xiàn)JSON序列化互轉(zhuǎn)的解決方案,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習一下2024-03-03
Java如何使用ReentrantLock實現(xiàn)長輪詢
這篇文章主要介紹了如何使用ReentrantLock實現(xiàn)長輪詢,對ReentrantLock感興趣的同學(xué),可以參考下2021-04-04

