@requirespermissions注解是什么意思_如何基于spring开发自定义注解实现对接口访问频次限制?...
做JavaWeb的開發的同學們都應該遇到過,客戶要求某個接口進行頻次的限制,如每秒并發10個,或者短信驗證碼發送場景,60秒內只允許發送一次。
通常開發的小伙伴們肯定是拿到以上需求在接口邏輯里進行實現,噼里啪啦一頓輸出,OK搞定了,很簡單。的確,這些需求比較簡單,但是,有沒有想過,這種頻次限制其實是和業務耦合度不高,能不能統一封裝,在業務需要的時候直接設置就行了呢?
答案是肯定的。自定義注解來實現就非常的方便,對你的業務接口增加自定義注解,無需修改業務代碼即可快速按需完成想要的功能。
第一步:當然是定義一個自定義注解,如RateLimit
定義一個自定義注解RateLimit應用在方法或者類上,并定義相關關鍵字段,參數Key、頻次數、時間、錯誤提示等。意思就是,在多少時間內,根據參數Key獲取的值為判斷依據,允許多少頻次數的訪問,如果超過,那么提示錯誤提示語,并拒絕訪問。
第二步:實現HandlerInterceptor自定義一個攔截器
在攔截器里重寫preHandle,將Object handler轉換成HandlerMethod類型傳遞給自定義的securityManager處理,小伙伴也可以在這個地方直接實現,直接實現代碼就不是顯得那么高大上了。
第三步:核心處理邏輯
核心處理方法為handle方法,專門處理類RateLimitHandler。該方法,獲取到方法上的注解類RateLimit,并獲取到注解類里的關鍵信息:key()、fromHead()。fromHead為true表示從請求頭根據key值獲取對應的value值作為唯一標識uuid,否則直接從請求參數里根據key獲取唯一標識。獲取唯一標識后,調用validateRate方法進行校驗是否超過頻次,傳入uuid,時間、時間單元,當前請求對象。
校驗方法,首先根據uuid生成一個內部key,用于區分不同業務,cacheHandler是一個緩存實現,本例中,cacheHandler其實注入的是redis實例,也可以是內存實例。調用cacheHandler自增方法返回一個值,為什么要用自增,是因為考慮并發情況,不能先get再set。如果為1,表示第一次訪問,設置一個失效時間,即注解定義的多少時間內,在這個時間過后,自動失效。
最后判斷次數是否超過注解類定義的頻次數,如果超過,返回false,否則,返回true。到此,自定義注解的實現就結束了。大家疑惑,如果使用起來呢。
第四步:使用,如:60秒內,只允許請求一次(哈哈哈短信驗證碼使用場景)
OK,就是這么簡單,后續有其他相似的業務只需加這個注解,修改不同的時間、限制次數就可以。
總結
以上是生活随笔為你收集整理的@requirespermissions注解是什么意思_如何基于spring开发自定义注解实现对接口访问频次限制?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redis缓存路由为空_Springbo
- 下一篇: less 函数_Python中的函数式编