Spring Boot 結合 Google Guava 緩存機制實現防重復提交策略
在Web應用中,防重復提交是一個常見的需求,特別是在表單提交和訂單處理中。如果前端沒有進行防重復提交的處理,用戶可能會因為網絡延遲或誤操作導致多次提交,從而生成重復的數據記錄。為了解決這個問題,可以在后端實現防重復提交的機制。本文將介紹如何在Spring Boot應用中使用Google Guava緩存來實現這一功能。
1. 添加Google Guava依賴
首先,需要在Spring Boot項目的pom.xml文件中添加Google Guava的依賴。Google Guava是一個強大的Java庫,提供了豐富的集合類、緩存機制、原生類型支持等特性。
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>
2. 創建緩存配置類
接下來,需要創建一個配置類來初始化Guava緩存。在這個配置類中,定義一個Bean來創建并配置緩存。
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.TimeUnit;
@Configuration
public class CacheConfig {
@Bean
public Cache<String, String> requestCache() {
return CacheBuilder.newBuilder()
.expireAfterWrite(5, TimeUnit.MINUTES) // 設置緩存過期時間
.build();
}
}
3. 創建防重復提交攔截器
然后,創建一個攔截器來檢查請求是否重復。這個攔截器會實現HandlerInterceptor接口,并在preHandle方法中判斷請求是否已經被緩存。
import com.google.common.cache.Cache;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class DuplicateSubmissionInterceptor implements HandlerInterceptor {
@Autowired
private Cache<String, String> requestCache;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String key = generateKey(request);
if (key != null && requestCache.getIfPresent(key) != null) {
response.setStatus(HttpServletResponse.SC_CONFLICT); // 409 Conflict
return false;
} else {
requestCache.put(key, "");
return true;
}
}
private String generateKey(HttpServletRequest request) {
// 根據請求生成唯一鍵,例如可以根據URL和參數生成MD5值
String url = request.getRequestURI();
String queryString = request.getQueryString();
return url + (queryString != null ? "?" + queryString : "");
}
}
4. 注冊攔截器
最后,需要將攔截器注冊到Spring MVC中。在配置類中實現WebMvcConfigurer接口,并在addInterceptors方法中將攔截器添加到攔截器注冊表中。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private DuplicateSubmissionInterceptor duplicateSubmissionInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(duplicateSubmissionInterceptor).addPathPatterns("/**"); // 對所有請求進行攔截
}
}
總結
通過以上步驟,已經成功實現了一個基于Google Guava緩存的防重復提交功能。利用Guava緩存的高效性和簡潔性,能夠有效地防止短時間內的重復請求。你可以根據實際需求調整緩存的過期時間和生成唯一鍵的邏輯。
這種方法不僅適用于表單提交,還可以用于任何需要防重復請求的場景。同時,由于Guava緩存是內存級別的緩存,性能較高,適用于單節點應用。如果需要分布式部署,可以考慮使用Redis等分布式緩存來實現。