亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

springboot如何防止重復請求

發布時間:2023-02-01 09:22:51 來源:億速云 閱讀:145 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“springboot如何防止重復請求”,內容詳細,步驟清晰,細節處理妥當,希望這篇“springboot如何防止重復請求”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

利用 springboot + redis 實現過濾重復提交的請求,業務流程如下所示,首先定義一個攔截器,攔截需要進行過濾的URL,然后用 session + URL 作為唯一 key,利用 redis setnx 命令,來判斷請求是否重復,如果 key set 成功,說明非重復請求,失敗則說明重復請求;

springboot如何防止重復請求

URL 攔截器可以使用 spring 攔截器,但使用 spring,每個需要過濾的新 URL 都需要添加配置,因此這里使用 AOP 注解 的形式來實現,這樣更直觀一點;
首先,定義注解:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface AvoidRepeatRequest {
    /** 請求間隔時間,單位秒,該時間范圍內的請求為重復請求 */
    int intervalTime() default 5;
    /** 返回的提示信息 */
    String msg() default "請不要頻繁重復請求!";
}

然后定義 AOP,實現重復請求過濾功能:

@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() {}

    // 實現過濾重復請求功能
    @Around("arrPointcut()")
    public Object arrBusiness(ProceedingJoinPoint joinPoint) {
        // 獲取 redis key,由 session ID 和 請求URI 構成
        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);

        // 判斷是否是重復的請求
        if (!redisTemplate.opsForValue().setIfAbsent(key, 1, arr.intervalTime(), TimeUnit.SECONDS)) {
            // 已發起過請求
            System.out.println("重復請求");
            return arr.msg();
        }

        try {
            // 非重復請求,執行業務代碼
            return joinPoint.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            return "error";
        }
    }
}

測試使用:

@RestController
public class TestAop {

    // 使用 AvoidRepeatRequest 注解的請求,表明需要進行重復請求判斷
    @AvoidRepeatRequest(intervalTime = 6, msg = "慢點,兄弟")
    @GetMapping("test/aop")
    public String test() {
        return "test aop";
    }
}

讀到這里,這篇“springboot如何防止重復請求”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

上林县| 巫山县| 桃园市| 石泉县| 南华县| 新津县| 五指山市| 广汉市| 孟州市| 武夷山市| 南涧| 海阳市| 勐海县| 抚顺县| 谢通门县| 葫芦岛市| 盐边县| 桂林市| 瑞丽市| 乌苏市| 乌拉特中旗| 潢川县| 武山县| 东辽县| 广宗县| 卢龙县| 建水县| 华宁县| 吉安县| 兴安盟| 庄浪县| 商丘市| 涞源县| 绵阳市| 巴彦淖尔市| 黄浦区| 米泉市| 漯河市| 理塘县| 柳林县| 株洲市|