日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Springboot+Redis實(shí)現(xiàn)API接口限流的示例代碼

瀏覽:26日期:2023-02-22 10:42:37

添加Redis的jar包.

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency>

在application.yml中配置redis

spring: ## Redis redis: database: 0 host: 127.0.0.1 port: 6379 password: jedis:pool: max-active: 8 max-wait: -1ms max-idle: 8 min-idle: 0 timeout: 2000ms

添加自定義注解

@Inherited@Documented@Target({ElementType.FIELD,ElementType.TYPE,ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface AccessLimit { //指定second 時(shí)間內(nèi) API請(qǐng)求次數(shù) int times() default 4; // 請(qǐng)求次數(shù)的指定時(shí)間范圍 秒數(shù)(redis數(shù)據(jù)過(guò)期時(shí)間) int second() default 10;}

編寫(xiě)攔截器

import com.ys.xlb.annotation.AccessLimit;import com.ys.xlb.bean.Code;import com.ys.xlb.exception.GlobalException;import com.ys.xlb.utils.IpUtils;import com.ys.xlb.utils.RequestUtils;import com.ys.xlb.utils.ResultUtils;import lombok.extern.slf4j.Slf4j;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.stereotype.Component;import org.springframework.web.method.HandlerMethod;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import javax.annotation.Resource;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.lang.reflect.Method;import java.util.concurrent.TimeUnit;/** * @ClassName AccessLimitInterceptor * @description: API請(qǐng)求限流攔截器 * @time 2019-04-20 11:08 **/@Slf4j@Componentpublic class AccessLimitInterceptor implements HandlerInterceptor { @Resource private RedisTemplate<String, Integer> redisTemplate; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {try{ // Handler 是否為 HandlerMethod 實(shí)例 if(handler instanceof HandlerMethod){// 強(qiáng)轉(zhuǎn)HandlerMethod handlerMethod = (HandlerMethod) handler;// 獲取方法Method method = handlerMethod.getMethod();// 是否有AccessLimit注解if(!method.isAnnotationPresent(AccessLimit.class)){ return true;}// 獲取注解內(nèi)容信息AccessLimit accessLimit = method.getAnnotation(AccessLimit.class);if(accessLimit == null){ return true;}int times = accessLimit.times();//請(qǐng)求次數(shù)int second = accessLimit.second();//請(qǐng)求時(shí)間范圍//根據(jù) IP + API 限流String key = IpUtils.getIpAddr(request) + request.getRequestURI();//根據(jù)key獲取已請(qǐng)求次數(shù)Integer maxTimes = redisTemplate.opsForValue().get(key);if(maxTimes == null){ //set時(shí)一定要加過(guò)期時(shí)間 redisTemplate.opsForValue().set(key, 1, second, TimeUnit.SECONDS);}else if(maxTimes < times){ redisTemplate.opsForValue().set(key, maxTimes+1, second, TimeUnit.SECONDS);}else{ // 30405 API_REQUEST_TOO_MUCH 請(qǐng)求過(guò)于頻繁 RequestUtils.out(response, ResultUtils.error(Code.API_REQUEST_TOO_MUCH)); return false;} }}catch (Exception e){ log.error('API請(qǐng)求限流攔截異常,請(qǐng)檢查Redis是否開(kāi)啟!',e); throw new GlobalException(Code.BAD_REQUEST,e.getMessage());}return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { }}

方法中的IP工具類方法

/** * IpUtils工具類方法 * 獲取真實(shí)的ip地址 * @param request * @return */ public static String getIpAddr(HttpServletRequest request) {String ip = request.getHeader('X-Forwarded-For');if(org.apache.commons.lang.StringUtils.isNotEmpty(ip) && !'unKnown'.equalsIgnoreCase(ip)){ //多次反向代理后會(huì)有多個(gè)ip值,第一個(gè)ip才是真實(shí)ip int index = ip.indexOf(','); if(index != -1){return ip.substring(0,index); }else{return ip; }}ip = request.getHeader('X-Real-IP');if(org.apache.commons.lang.StringUtils.isNotEmpty(ip) && !'unKnown'.equalsIgnoreCase(ip)){ return ip;}return request.getRemoteAddr(); }

RequestUtils.out()方法

/** * @Title: out * @Description: response輸出JSON數(shù)據(jù) * @param response : 響應(yīng)請(qǐng)求 * @param object: object * @return void **/ public static void out(ServletResponse response, Object object){PrintWriter out = null;try { response.setContentType('application/json;charset=UTF-8'); response.setCharacterEncoding('UTF-8'); out = response.getWriter(); out.println(JSONObject.fromObject(resultMap).toString());} catch (Exception e) { log.error('輸出JSON報(bào)錯(cuò)!'+e);}finally{ if(null != out){out.flush();out.close(); }} }

配置攔截器

@Configurationpublic class ApplicationConfig implements WebMvcConfigurer { //這里需要注入攔截器 否則無(wú)法獲取到攔截器注入的RedisTemplate<String, Integer> redisTemplate; @Bean public AccessLimitInterceptor accessLimitInterceptor(){return new AccessLimitInterceptor(); } /** * 配置攔截器 * @author lance * @param registry */ @Override public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor()).addPathPatterns('/**').excludePathPatterns('/static/**','/login.html','/user/login');//API限流攔截registry.addInterceptor(accessLimitInterceptor()).addPathPatterns('/**').excludePathPatterns('/static/**','/login.html'); }}

配置攔截器的類中必須先注入這個(gè)攔截器否則無(wú)法獲取到攔截器注入的RedisTemplate<String, Integer> redisTemplate

使用注解

/** * @Title: selectAll * @Description: 查詢文章信息 **/ @AccessLimit(times = 5) @RequestMapping(value = 'selectAll' , method = {RequestMethod.GET,RequestMethod.POST}) //GetMapping(value = 'selectAll') public ResultBody selectAll(Article article) {return articleService.selectAll(article); }

請(qǐng)求測(cè)試

Springboot+Redis實(shí)現(xiàn)API接口限流的示例代碼

時(shí)間間隔為默認(rèn)的10s, 10s內(nèi)請(qǐng)求第6次出現(xiàn)此返回值,完成.

參考博客:https://blog.csdn.net/zrg523/article/details/82185088

到此這篇關(guān)于Springboot+Redis實(shí)現(xiàn)API接口限流的示例代碼的文章就介紹到這了,更多相關(guān)Springboot+Redis接口API限流內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲精品裸体| 成人午夜毛片| 免费观看在线色综合| 国产精品最新| 欧美国产精品| 久久人人88| 91九色精品| 国产精品久久久久久妇女| 欧美男人天堂| 日韩动漫一区| 精品黄色一级片| 日本精品影院| 国产精品地址| 美女91精品| 999视频精品| 欧美va天堂在线| 黄色av日韩| 日韩欧美视频专区| 国产精品久久久久蜜臀| 亚洲一本视频| 亚洲欧美日韩视频二区| 欧美特黄一级大片| 91看片一区| 色综合www| 三级精品视频| 欧美日韩国产在线观看网站| 欧美自拍一区| 欧美三区不卡| 91在线成人| 国产精品久久久久久模特| 7m精品国产导航在线| 制服诱惑一区二区| 欧美一级精品| 国产一区欧美| 久久中文字幕导航| 美女精品一区| 久久女人天堂| 日本在线视频一区二区| 国产一区三区在线播放| 亚洲综合精品四区| 日韩成人a**站| 午夜视频精品| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 国内精品麻豆美女在线播放视频| 久久国产成人午夜av影院宅| 国产欧美日韩免费观看| 久久中文视频| 丝袜诱惑一区二区| 在线综合欧美| 日韩午夜电影| 午夜精品一区二区三区国产| 国产中文欧美日韩在线| 日韩欧乱色一区二区三区在线| 亚洲一区二区三区免费在线观看| 久久久一本精品| 成人日韩av| 精品国产亚洲日本| 久久免费精品| 91偷拍一区二区三区精品| 国产精品一区二区美女视频免费看| 亚洲精品第一| 在线一区欧美| 日韩精品第一| 日本va欧美va瓶| 一区二区国产在线观看| 日韩精品一区二区三区免费视频| 免费视频一区二区| 成人va天堂| 在线视频亚洲欧美中文| 日本不卡中文字幕| 久久国产精品免费一区二区三区| 日韩1区2区日韩1区2区| 日本成人手机在线| 国产伦精品一区二区三区千人斩| 国产精品久久久久久久久久妞妞 | 石原莉奈在线亚洲三区| 中文日韩在线| 视频一区中文字幕国产| 国产欧美久久一区二区三区| 日本亚洲最大的色成网站www| 日韩高清一区二区| 国产精品久久国产愉拍| 麻豆极品一区二区三区| 久久久久国产| 无码日韩精品一区二区免费| 久久久精品国产**网站| 国产精品yjizz视频网| 久久精品国产久精国产爱| 欧美激情另类| 国产二区精品| 97久久亚洲| 久久久久久久久久久妇女| 伊人国产精品| 亚洲永久av| 日本三级亚洲精品| 秋霞影视一区二区三区| 国产精品久久久久久久免费软件 | 久久高清免费观看| 国产精品丝袜xxxxxxx| 欧美精品不卡| 三级精品视频| 欧美国产三级| 久久av在线| 在线天堂资源www在线污| 亚洲精品欧美| 91av亚洲| 精品视频网站| 亚洲专区视频| 99亚洲精品| zzzwww在线看片免费| 日韩欧美在线精品| 秋霞影院一区二区三区| 免费在线观看视频一区| 免费在线播放第一区高清av| 一级欧美视频| 午夜久久中文| 国产精品毛片aⅴ一区二区三区| 亚洲一区二区三区高清不卡| 日韩中文欧美| 91亚洲国产| 国产96在线亚洲| 精品三级av| 久久久91麻豆精品国产一区| 日本不卡高清| 日韩在线麻豆| 日本va欧美va精品发布| 日韩精品一级中文字幕精品视频免费观看| 黄色网一区二区| 亚洲精品麻豆| 日韩精品视频在线看| 麻豆精品网站| 欧美综合二区| 中文字幕一区二区av| 亚洲激情五月| 亚洲在线网站| 免费在线观看不卡| 日本综合精品一区| 日韩av午夜在线观看| 日韩欧美中文在线观看| 久久精品99国产精品| 国产日韩欧美在线播放不卡| 午夜久久av| 久久不见久久见国语| 男女精品网站| 国产美女久久| 午夜影院一区| 亚洲视频综合| 在线国产精品一区| 国产亚洲一区| 91日韩免费| 国产亚洲一区在线| 欧美日韩精品一区二区三区视频| 麻豆视频观看网址久久| 深夜视频一区二区| 亚洲专区一区| 国产美女视频一区二区| 亚洲精品.com| 日韩在线卡一卡二| 国产视频一区二区在线播放| 精品亚洲免a| 美女精品在线| 嫩呦国产一区二区三区av| 日韩1区2区| 黄色日韩在线| 在线午夜精品| 久久99青青| 尤物在线精品| 久久精品国产999大香线蕉| 亚洲第一区色| 日本午夜精品久久久久| 久久久久久婷| 国产精品永久| 亚洲一区二区av| 国产精品一区二区三区美女 | 电影91久久久| 久久影院一区| 麻豆精品一区二区综合av| 米奇777超碰欧美日韩亚洲| 国产精品magnet| 亚洲免费影视| 国产在线|日韩| 国内自拍视频一区二区三区| 日韩成人三级| 久久只有精品| 国产精品igao视频网网址不卡日韩| 亚洲精品网址| 欧产日产国产精品视频| 久久gogo国模啪啪裸体| 免费成人在线观看| 欧美高清一区| 精品资源在线| 日韩精品福利一区二区三区| 蜜臀av国产精品久久久久| av免费不卡国产观看| 国产欧美日韩精品一区二区免费| 亚洲综合精品四区| 一区在线视频观看| 高清一区二区三区av| 免费在线观看一区| 国产精品红桃|