您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“springboot如何防止重復(fù)請求”,內(nèi)容詳細,步驟清晰,細節(jié)處理妥當(dāng),希望這篇“springboot如何防止重復(fù)請求”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。
利用 springboot + redis 實現(xiàn)過濾重復(fù)提交的請求,業(yè)務(wù)流程如下所示,首先定義一個攔截器,攔截需要進行過濾的URL,然后用 session + URL 作為唯一 key,利用 redis setnx 命令,來判斷請求是否重復(fù),如果 key set 成功,說明非重復(fù)請求,失敗則說明重復(fù)請求;
URL 攔截器可以使用 spring 攔截器,但使用 spring,每個需要過濾的新 URL 都需要添加配置,因此這里使用 AOP 注解 的形式來實現(xiàn),這樣更直觀一點;
首先,定義注解:
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.TYPE}) public @interface AvoidRepeatRequest { /** 請求間隔時間,單位秒,該時間范圍內(nèi)的請求為重復(fù)請求 */ int intervalTime() default 5; /** 返回的提示信息 */ String msg() default "請不要頻繁重復(fù)請求!"; }
然后定義 AOP,實現(xiàn)重復(fù)請求過濾功能:
@Component @Aspect @Order(100) public class FilterRepeatRequest { private static final String SUFFIX = "REQUEST_"; @Autowired private RedisTemplate redisTemplate; // 定義 注解 類型的切點 @Pointcut("@annotation(com.common.ann.AvoidRepeatRequest)") public void arrPointcut() {} // 實現(xiàn)過濾重復(fù)請求功能 @Around("arrPointcut()") public Object arrBusiness(ProceedingJoinPoint joinPoint) { // 獲取 redis key,由 session ID 和 請求URI 構(gòu)成 ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); HttpServletRequest request = sra.getRequest(); String key = SUFFIX + request.getSession().getId() + "_" + request.getRequestURI(); // 獲取方法的 AvoidRepeatRequest 注解 Method method = ((MethodSignature) joinPoint.getSignature()).getMethod(); AvoidRepeatRequest arr = method.getAnnotation(AvoidRepeatRequest.class); // 判斷是否是重復(fù)的請求 if (!redisTemplate.opsForValue().setIfAbsent(key, 1, arr.intervalTime(), TimeUnit.SECONDS)) { // 已發(fā)起過請求 System.out.println("重復(fù)請求"); return arr.msg(); } try { // 非重復(fù)請求,執(zhí)行業(yè)務(wù)代碼 return joinPoint.proceed(); } catch (Throwable throwable) { throwable.printStackTrace(); return "error"; } } }
測試使用:
@RestController public class TestAop { // 使用 AvoidRepeatRequest 注解的請求,表明需要進行重復(fù)請求判斷 @AvoidRepeatRequest(intervalTime = 6, msg = "慢點,兄弟") @GetMapping("test/aop") public String test() { return "test aop"; } }
讀到這里,這篇“springboot如何防止重復(fù)請求”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。