精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

接口被惡意狂刷,怎么辦?

開發(fā) 前端
判斷是否為相同請求,使用:URI+userId+日期。即Redis的key=URI+userId+yyyyMMdd,緩存有效期為一天。很多都在代碼里有注釋了,另外強調(diào)一下,不要吐槽代碼,僅僅是演示。

 [[415967]]

下面是原本面試現(xiàn)場:

面試官:接口被惡意狂刷,怎么辦?

我:這個沒搞過(每天CRUD,真的沒搞過)

面試官:如果現(xiàn)在讓你來設計,你會怎么設計?

我:巴拉巴拉...胡扯一通

面試官:(帶著不耐煩的表情)我們還是換個話題吧

.....

為了不讓大家也和我有同樣的遭遇,今天,咱們就用一個非常簡單的方式實現(xiàn)防刷:

一個注解搞定防刷

技術點

涉及到的技術點有如下幾個:

  • 自定義注解
  • 攔截器
  • Redis的基本操作
  • Spring Boot項目

其實,非常簡單,主要的還是看業(yè)務。

本文主要內(nèi)容:

自定義注解

自定義一注解AccessLimit。

  1. import java.lang.annotation.Retention; 
  2. import java.lang.annotation.Target; 
  3.   
  4. import static java.lang.annotation.ElementType.METHOD; 
  5. import static java.lang.annotation.RetentionPolicy.RUNTIME; 
  6.   
  7. @Retention(RUNTIME) 
  8. @Target(METHOD) 
  9. public @interface AccessLimit {  
  10.     //次數(shù)上限 
  11.     int maxCount(); 
  12.     //是否需要登錄 
  13.     boolean needLogin()default false

添加Redis配置項

在配置文件中,加入Redis配置;

  1. spring.redis.database=0 
  2. spring.redis.host=127.0.0.1 
  3. spring.redis.port=6379 
  4. spring.redis.jedis.pool.max-active=100 
  5. spring.redis.jedis.pool.max-idle=100 
  6. spring.redis.jedis.pool.min-idle=10 
  7. spring.redis.jedis.pool.max-wait=1000ms 

注意,把Redis的starter在pom中引入。

  1. <dependency> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-starter-data-redis</artifactId> 
  4.  </dependency> 

創(chuàng)建攔截器

創(chuàng)建攔截器,所有請求都進行攔截,防刷的主要內(nèi)容全部在這里。

  1. // 一堆import 這里就不貼出來了,需要的自己導入 
  2. /** 
  3.  *  處理方法上 有 AccessLimitEnum 注解的方法 
  4.  * @author java后端技術全棧 
  5.  * @date 2021/8/6 15:42 
  6.  */ 
  7. @Component  
  8. public class FangshuaInterceptor extends HandlerInterceptorAdapter { 
  9.  
  10.     @Resource 
  11.     private RedisTemplate<String,Object> redisTemplate; 
  12.  
  13.     @Override 
  14.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
  15.  
  16.         System.out.println("----FangshuaInterceptor-----"); 
  17.         //判斷請求是否屬于方法的請求 
  18.         if (handler instanceof HandlerMethod) { 
  19.  
  20.             HandlerMethod hm = (HandlerMethod) handler; 
  21.  
  22.             //檢查方法上室友有AccessLimit注解 
  23.             AccessLimit accessLimit = hm.getMethodAnnotation(AccessLimit.class); 
  24.             if (accessLimit == null) { 
  25.                 return true
  26.             } 
  27.             //獲取注解中的參數(shù), 
  28.             int maxCount = accessLimit.maxCount(); 
  29.             boolean login = accessLimit.needLogin(); 
  30.             String key = request.getRequestURI(); 
  31.             //防刷=同一個請求路徑+同一個用戶+當天 
  32.             //如果需要登錄 
  33.             if (login) { 
  34.                 //可以充session中獲取user相關信息 
  35.                 //這里的userId暫時寫死, 
  36.                 Long userId = 101L; 
  37.                 String currentDay = format(new Date(), "yyyyMMdd"); 
  38.                 key += currentDay + userId; 
  39.             }else
  40.                 //可以根據(jù)用戶使用的ip+日期進行判斷 
  41.             } 
  42.  
  43.             //從redis中獲取用戶訪問的次數(shù) 
  44.             Object countCache = redisTemplate.opsForValue().get(key); 
  45.             if (countCache == null) { 
  46.                 //第一次訪問,有效期為一天 
  47.                 //時間單位自行定義 
  48.                 redisTemplate.opsForValue().set(key,1,86400, TimeUnit.SECONDS); 
  49.             } else
  50.                 Integer count = (Integer)countCache; 
  51.                 if (count < maxCount) { 
  52.                     //加1 
  53.                     count++; 
  54.                     //也可以使用increment(key)方法 
  55.                     redisTemplate.opsForValue().set(key,count); 
  56.                 } else { 
  57.                     //超出訪問次數(shù) 
  58.                     render(response, "訪問次數(shù)已達上限!"); 
  59.                     return false
  60.                 } 
  61.             } 
  62.         } 
  63.         return true
  64.     } 
  65.     //僅僅是為了演示哈 
  66.     private void render(HttpServletResponse response, String msg) throws Exception { 
  67.         response.setContentType("application/json;charset=UTF-8"); 
  68.         OutputStream out = response.getOutputStream(); 
  69.         out.write(msg.getBytes("UTF-8")); 
  70.         out.flush(); 
  71.         out.close(); 
  72.     } 
  73.     //日期格式 
  74.     public static String format(Date date, String formatString) { 
  75.         if (formatString == null) { 
  76.             formatString = DATE_TIME_FORMAT; 
  77.         } 
  78.         DateFormat dd = new SimpleDateFormat(formatString); 
  79.         return dd.format(date); 
  80.     } 

注意

判斷是否為相同請求,使用:URI+userId+日期。即Redis的key=URI+userId+yyyyMMdd,緩存有效期為一天。

很多都在代碼里有注釋了,另外強調(diào)一下,不要吐槽代碼,僅僅是演示。

注冊攔截器

盡管上面我們已經(jīng)自定義并實現(xiàn)好了攔截器,但還需要我們手動注冊。

  1. import com.example.demo.ExceptionHander.FangshuaInterceptor; 
  2. import org.springframework.beans.factory.annotation.Autowired; 
  3. import org.springframework.context.annotation.Configuration; 
  4. import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 
  5. import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 
  6.  
  7. @Configuration 
  8. public class WebConfig extends WebMvcConfigurerAdapter { 
  9.   
  10.     @Autowired 
  11.     private FangshuaInterceptor interceptor; 
  12.   
  13.   
  14.     @Override 
  15.     public void addInterceptors(InterceptorRegistry registry) { 
  16.         registry.addInterceptor(interceptor); 
  17.     } 

這樣我們的注解就正式注冊到攔截器鏈中了,后面項目中才會有效。

使用注解

前面的準備都搞定了,現(xiàn)在來具體使用。

首先,我們創(chuàng)建一個簡單的controller,然后,在方法上加上我們自定義的注解AccessLimit,就可以實現(xiàn)接口防刷了。

  1. import com.example.demo.result.Result; 
  2. import org.springframework.stereotype.Controller; 
  3. import org.springframework.web.bind.annotation.RequestMapping; 
  4. import org.springframework.web.bind.annotation.ResponseBody; 
  5.   
  6. @Controller 
  7. public class FangshuaController { 
  8.     //具體請求次數(shù)由具體業(yè)務決定,以及是否需要登錄 
  9.     @AccessLimit(maxCount=5, needLogin=true
  10.     @RequestMapping("/fangshua"
  11.     @ResponseBody 
  12.     public Object fangshua(){ 
  13.         return "請求成功"
  14.   
  15.     } 

測試,瀏覽器頁面上訪問:http://localhost:8080/fangshua

前面4次返回的是:請求成功

超過4次后變成:訪問次數(shù)已達上限!

一個注解就搞定了,是不是 so easy !!!

總結

關于接口防刷,如果在面試中被問到,至少還是能說個123了。也建議大家手動試試,自己搞出來了更帶勁兒。

 

責任編輯:武曉燕 來源: Java后端技術全棧
相關推薦

2024-08-06 08:08:14

2024-02-19 00:00:00

接口圖形驗證碼

2016-08-08 15:03:54

騰訊云電商騰訊云天御系統(tǒng)

2025-05-12 09:30:51

2021-10-01 00:12:12

Redis分布式

2024-03-13 13:25:09

Redis分布式鎖

2011-06-30 17:58:30

網(wǎng)站被K

2020-07-10 08:46:26

HTTPS證書劫持網(wǎng)絡協(xié)議

2025-06-12 08:21:22

2015-03-31 15:33:55

2012-11-27 10:41:33

2021-04-13 10:41:25

Redis內(nèi)存數(shù)據(jù)庫

2018-11-27 09:28:41

API攻擊惡意

2011-06-27 15:42:23

降權SEO

2017-05-11 16:54:16

2017-12-08 11:14:21

2019-02-18 15:45:24

CPU頻率溫度

2015-03-24 16:58:18

iPhone6

2022-09-05 09:02:01

服務器CPU服務

2017-03-13 15:25:51

Windows 7Windows端口占用
點贊
收藏

51CTO技術棧公眾號

国产freexxxx性播放麻豆| 91亚洲精品久久久| 五月天综合视频| 无人区在线高清完整免费版 一区二| 久久噜噜亚洲综合| 国产在线精品播放| 国产无遮挡免费视频| 欧美精品第一区| 3d动漫精品啪啪1区2区免费| 加勒比成人在线| 二区三区在线播放| 国产精品中文有码| 日本精品视频在线观看| 亚洲色婷婷一区二区三区| 另类图片第一页| 欧美日韩国产经典色站一区二区三区 | 国产69精品久久久久久久久久| 日本一区二区免费高清| 精品剧情在线观看| 中文字幕av不卡在线| av老司机免费在线| 亚洲欧美一区二区三区孕妇| 欧美性大战久久久久| 精品毛片在线观看| 日韩精品每日更新| 97热精品视频官网| 日韩成人短视频| 国产欧美日韩一区二区三区四区 | 成人午夜福利视频| 麻豆久久久久久| 欧美在线视频一区二区| 免费日韩在线视频| 久久久久av| 国产亚洲一区二区精品| 黄色av网址在线观看| 亚洲精品69| 欧美三片在线视频观看| 久久久久人妻精品一区三寸| 国产精品一区hongkong| 亚洲精品免费在线| 国产又大又长又粗又黄| 午夜毛片在线| 国产欧美精品区一区二区三区| 精品久久久久久乱码天堂| 成人黄色免费视频| 狠狠色丁香婷综合久久| 国产精品久久在线观看| 黄色网址中文字幕| 久久中文欧美| 日韩免费观看在线观看| 久久精品视频1| 中日韩男男gay无套| 国内精品久久久久久影视8| 欧美日韩国产精品一区二区三区 | 成人免费视频国产在线观看| 亚洲中国色老太| 国产精品久久777777换脸| 极品美女销魂一区二区三区免费| 国产精品白嫩初高中害羞小美女| 一级特黄免费视频| 美女视频一区在线观看| 国产精品美乳在线观看| 一级片视频播放| 久久aⅴ国产欧美74aaa| 91精品久久久久久久| 国产精品人人爽| 国产经典欧美精品| 国产一区二区三区黄| 天堂在线观看视频| 久久男人中文字幕资源站| 欧美重口乱码一区二区| 成人高清免费在线播放| 国产精品久久久久久妇女6080| 椎名由奈jux491在线播放 | 97精品久久久| 亚洲久久在线观看| 视频一区中文字幕| 国产视频999| 精品二区在线观看| www.一区二区| 日产国产精品精品a∨| 在线免费观看黄| 亚洲美女淫视频| 亚洲理论电影在线观看| 综合在线影院| 欧美一区二区免费观在线| 中文字幕乱视频| 亚洲人挤奶视频| 日韩中文娱乐网| 日本三级片在线观看| 亚洲综合国产激情另类一区| 国产精品久久久久久搜索| 国产免费久久久| 波多野结衣视频一区| 欧美日韩亚洲一区二区三区四区| 日本天堂在线观看| 午夜欧美视频在线观看| 在线免费观看视频黄| www.神马久久| 亚洲一二在线观看| 久草国产在线观看| 日韩精品免费视频人成| 动漫精品视频| 免费大片黄在线观看视频网站| 亚洲午夜在线观看视频在线| 中文字幕在线导航| 岛国av一区| 日韩在线中文视频| 精品美女久久久久| 国产福利视频一区二区三区| 日本不卡免费新一二三区| 日本在线观看高清完整版| 在线精品国精品国产尤物884a| 手机看片国产精品| 日韩.com| 18久久久久久| 亚洲产国偷v产偷v自拍涩爱| 国产欧美一区二区三区沐欲| 亚洲国产精品成人天堂| 国产欧美视频在线| 在线性视频日韩欧美| 国产精品二区一区二区aⅴ| 精品写真视频在线观看| 欧美日韩在线不卡一区| 69av成人| 精品国产91乱码一区二区三区| www.99re6| 日本午夜精品一区二区三区电影| 黄色91av| 97人澡人人添人人爽欧美| 欧美一区二区三区四区久久| 国产激情av在线| 久久福利精品| 精品视频一区二区| 超碰在线中文字幕| 欧美成人精品3d动漫h| 婷婷久久综合网| 男男视频亚洲欧美| 天堂社区 天堂综合网 天堂资源最新版 | 久久久午夜电影| 日韩欧美一区二| 国偷自产视频一区二区久| 欧美大片va欧美在线播放| 国产精品熟女久久久久久| 亚洲国产精品成人久久综合一区| 免费午夜视频在线观看| 亚洲精品3区| 欧美夜福利tv在线| 国产在线你懂得| 欧美性xxxx极品hd欧美风情| av无码av天天av天天爽| 亚洲欧美网站| 欧美一区二区三区四区五区六区| 欧美黑人粗大| 国产一区二区三区在线免费观看 | 成人区精品一区二区| 黄色免费在线观看网站| 欧美一区二区三区色| 久久久久亚洲AV成人| 国产精品一二三在| 草草草视频在线观看| 97青娱国产盛宴精品视频| 国内揄拍国内精品| 看电影就来5566av视频在线播放| 欧亚洲嫩模精品一区三区| jizzjizzjizz国产| 国产精品一区在线观看你懂的| 欧美做受777cos| av不卡一区| 欧美自拍视频在线观看| 波多野结衣在线影院| 欧美精品一级二级| 久久久久久久国产视频| 99久久精品费精品国产一区二区| 狠狠操精品视频| 欧美韩日一区| www.久久久| 自拍一区在线观看| 亚洲天堂av女优| 国产一区二区在线视频观看| 一区二区免费看| 国产精品无码网站| 精久久久久久久久久久| 男人的天堂avav| 九九在线精品| 91网站在线免费观看| 国产夫妻在线播放| 日韩中文字幕免费看| 后入内射欧美99二区视频| 日本乱码高清不卡字幕| 午夜国产小视频| 91免费国产在线| 亚洲涩涩在线观看| 一本一本久久| 糖心vlog在线免费观看| 欧美做受69| 91在线看www| 美女日韩欧美| 欧美激情视频给我| 91精品专区| 日韩av一卡二卡| 一级特黄aaaaaa大片| 欧美性极品xxxx娇小| 麻豆视频在线免费看| 国产亚洲制服色| 麻豆精品国产传媒av| 免费黄网站欧美| 男人的天堂99| 亚洲福利电影| 一区二区三区我不卡| 亚洲人成精品久久久| 99久久伊人精品影院| 开心久久婷婷综合中文字幕| 91po在线观看91精品国产性色| 成人免费高清| 最近的2019中文字幕免费一页| 日韩美女一级视频| 精品国产一区二区亚洲人成毛片| 亚洲天堂网在线视频| 欧美性感美女h网站在线观看免费| 欧美交换国产一区内射| 国产精品美女久久久久久| 人人妻人人澡人人爽人人精品| 国产成人免费视频| 日本中文字幕观看| 日本中文字幕一区二区有限公司| 无码精品a∨在线观看中文| 你懂的视频一区二区| 手机在线视频你懂的| 成人中文视频| 深夜福利成人| 精品视频日韩| 欧美视频1区| 亚洲影院天堂中文av色| 国产尤物91| av日韩精品| 波多野结衣久草一区| 日韩一级淫片| 亚洲自拍偷拍在线| 日韩中文字幕视频网| 亚洲一区二区三| 免费欧美网站| 91在线短视频| 成人h动漫免费观看网站| 亚洲一区二区三区视频播放| 国产精一区二区| 91久久久久久国产精品| 亚洲欧美在线综合| 91手机在线播放| 日韩中文字幕| 狠狠色综合欧美激情| 小说区图片区色综合区| 欧美成人综合一区| 精品久久成人| 亚洲国产一区二区三区在线播| 成人久久综合| 吴梦梦av在线| 欧美日韩亚洲国产精品| av在线免费观看国产| 最新国产乱人伦偷精品免费网站| 成年人看的毛片| 久久久久久久欧美精品| 日本888xxxx| 国内国产精品久久| 95视频在线观看| 91蜜桃视频在线| 蜜桃av乱码一区二区三区| 国产精品无码永久免费888| 国产黄a三级三级| 亚洲综合免费观看高清完整版在线| 麻豆亚洲av熟女国产一区二| 午夜欧美2019年伦理| 日韩电影在线观看一区二区| 欧美日韩在线播| www.桃色av嫩草.com| 日韩精品在线播放| 91社区在线观看| 久久97精品久久久久久久不卡| 麻豆成全视频免费观看在线看| 国产精品69久久久久| 国产精品视频一区视频二区| 狠狠色噜噜狠狠狠狠色吗综合| 欧美日韩国产在线观看网站 | 亚洲aaa激情| 国产乱人伦丫前精品视频| 免费国产在线精品一区二区三区| 日韩欧美一区免费| 成人免费性视频| 日本麻豆一区二区三区视频| 波多野结衣电影免费观看| 26uuu国产在线精品一区二区| 少妇高潮惨叫久久久久| 亚洲成人av电影| 中文字幕 自拍偷拍| 欧美精品一区二区三区四区| www亚洲人| 国产69精品久久久久9| 国产成人精品一区二区三区视频| 国产成人精品福利一区二区三区 | 亚洲无线码在线一区观看| 国产网站在线免费观看| 欧洲精品久久久| 欧美精品影院| 亚洲精品国产精品国自产| 一区二区黄色| 熟妇无码乱子成人精品| 久久久久久麻豆| 国产在线欧美在线| 欧美视频你懂的| 色视频免费在线观看| 欧美区二区三区| 欧美天堂一区| 日本不卡久久| 国产精品呻吟| 亚洲国产精品第一页| 国产精品人成在线观看免费| 天天干天天干天天干天天| 欧美精品日韩综合在线| 免费在线黄色影片| 性欧美办公室18xxxxhd| 亚洲一二三区视频| 亚洲自拍偷拍一区二区三区| 日本伊人色综合网| 受虐m奴xxx在线观看| 亚洲福利一区二区| 国产高清免费观看| zzjj国产精品一区二区| 欧美色片在线观看| 欧美日韩国产一二| 性xx色xx综合久久久xx| 国产成人精品无码片区在线| 夜夜嗨av一区二区三区中文字幕| 91在线视频国产| 日韩中文av在线| 成人1区2区| 亚洲精蜜桃久在线| 日本亚洲免费观看| 色偷偷男人天堂| 欧美性极品少妇| av在线1区2区| 国产精品人成电影| 色综合久久一区二区三区| 杨幂毛片午夜性生毛片| 欧美国产精品中文字幕| 中文字幕欧美人妻精品| 最新的欧美黄色| 亚洲成人高清| 一级黄色录像免费看| 国产精品综合一区二区三区| 欧美肥妇bbwbbw| 日韩欧美一级特黄在线播放| 草莓福利社区在线| 97久久天天综合色天天综合色hd| 欧美1区2区| 在线播放第一页| 欧美日韩国产一区二区三区| 午夜在线视频免费| 国产极品精品在线观看| 精品国产中文字幕第一页| jizz欧美性11| 亚洲精品国产一区二区三区四区在线 | 日本三级视频在线观看| 96pao国产成视频永久免费| 日韩精品一区二区久久| 中文字幕在线视频精品| 亚洲一区二区三区四区的| 婷婷在线观看视频| 青青久久av北条麻妃海外网| 欧美呦呦网站| 奇米777在线| 亚洲成人av免费| 国产成人无码一区二区在线观看| 欧美私人啪啪vps| 日本女人性视频| 精品福利在线视频| 黄色的视频在线免费观看| 国产精品丝袜一区二区三区| 亚洲精品国产偷自在线观看| 午夜性福利视频| 欧美性生交大片免网| 色的视频在线免费看| 91精品国产99久久久久久红楼| 一级成人国产| 精品亚洲乱码一区二区 | 丰满肉嫩西川结衣av| 51精品国产黑色丝袜高跟鞋| 欧美日韩亚洲在线观看| 国产伦理在线观看| 一本久久综合亚洲鲁鲁五月天| 精品176二区| 免费一区二区三区| 国产精品综合在线视频| 日本一本在线观看| 色与欲影视天天看综合网| 国产中文字幕一区二区三区| av影片在线播放| 91高清视频免费看| 超碰资源在线| 黄色免费高清视频| 久久久午夜精品理论片中文字幕|