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

您的位置:首頁技術文章
文章詳情頁

Springboot+Redis實現API接口限流的示例代碼

瀏覽:25日期: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 時間內 API請求次數 int times() default 4; // 請求次數的指定時間范圍 秒數(redis數據過期時間) int second() default 10;}

編寫攔截器

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請求限流攔截器 * @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 實例 if(handler instanceof HandlerMethod){// 強轉HandlerMethod handlerMethod = (HandlerMethod) handler;// 獲取方法Method method = handlerMethod.getMethod();// 是否有AccessLimit注解if(!method.isAnnotationPresent(AccessLimit.class)){ return true;}// 獲取注解內容信息AccessLimit accessLimit = method.getAnnotation(AccessLimit.class);if(accessLimit == null){ return true;}int times = accessLimit.times();//請求次數int second = accessLimit.second();//請求時間范圍//根據 IP + API 限流String key = IpUtils.getIpAddr(request) + request.getRequestURI();//根據key獲取已請求次數Integer maxTimes = redisTemplate.opsForValue().get(key);if(maxTimes == null){ //set時一定要加過期時間 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 請求過于頻繁 RequestUtils.out(response, ResultUtils.error(Code.API_REQUEST_TOO_MUCH)); return false;} }}catch (Exception e){ log.error('API請求限流攔截異常,請檢查Redis是否開啟!',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工具類方法 * 獲取真實的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)){ //多次反向代理后會有多個ip值,第一個ip才是真實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數據 * @param response : 響應請求 * @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報錯!'+e);}finally{ if(null != out){out.flush();out.close(); }} }

配置攔截器

@Configurationpublic class ApplicationConfig implements WebMvcConfigurer { //這里需要注入攔截器 否則無法獲取到攔截器注入的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'); }}

配置攔截器的類中必須先注入這個攔截器否則無法獲取到攔截器注入的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); }

請求測試

Springboot+Redis實現API接口限流的示例代碼

時間間隔為默認的10s, 10s內請求第6次出現此返回值,完成.

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

到此這篇關于Springboot+Redis實現API接口限流的示例代碼的文章就介紹到這了,更多相關Springboot+Redis接口API限流內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
午夜久久一区| 久久福利在线| 国产精品美女在线观看直播| 亚洲综合欧美| 国产韩日影视精品| 电影天堂国产精品| 日韩久久精品| 蜜桃久久久久| 国产日韩一区二区三免费高清| 午夜日韩在线| 日韩三区免费| 91精品韩国| 日韩av免费| 日本蜜桃在线观看视频| 精品中文在线| 国产激情欧美| 国产精品久久久一区二区| 69堂免费精品视频在线播放| 欧美专区18| 亚洲一区中文| 国产亚洲精品久久久久婷婷瑜伽| 国内精品福利| 深夜视频一区二区| 男女性色大片免费观看一区二区| 久久先锋影音| 亚洲精选久久| 日本国产欧美| 欧美日韩a区| 国产精品网址| 日本成人在线一区| 欧美亚洲二区| 日韩三级一区| 日韩专区视频网站| 婷婷激情久久| 一本大道色婷婷在线| 欧美国产美女| 福利一区二区| 欧美精品高清| 日韩大片免费观看| 999久久久91| 国产精品女主播一区二区三区| 亚洲综合不卡| 日本不卡视频在线| 麻豆久久久久久| 亚洲永久av| 欧美综合另类| 亚洲精品激情| 免费视频一区二区三区在线观看| 国产一区二区久久久久| 亚洲国产专区校园欧美| 性一交一乱一区二区洋洋av| 亚洲精品第一| 美女精品久久| 国产在线看片免费视频在线观看| 国产综合亚洲精品一区二| 亚洲欧美日韩国产一区| 日韩精品三级| 美日韩一区二区三区| 国产传媒av在线| 欧洲毛片在线视频免费观看| 久久xxxx精品视频| 久久国产日韩| 免费视频最近日韩| 国产精品入口久久| 日韩精品中文字幕第1页| 国产亚洲高清视频| 国产精品久久久久9999高清| 91精品国产乱码久久久久久久| 国产一区二区高清| 欧美精品导航| 亚洲激情二区| 免费日韩成人| 亚洲资源av| 精品国产一级| 久热精品在线| 国产一区二区久久久久| 免费日韩视频| 国产一区二区三区探花| 亚洲一区二区成人| 精品免费视频| 日韩中文欧美在线| 国产一区二区亚洲| 视频一区欧美精品| 国产精品黄网站| 91久久中文| 欧美日一区二区在线观看| 久久夜夜操妹子| 日韩一区二区三免费高清在线观看 | 丁香婷婷久久| 中文精品在线| 精品美女在线视频| 免费久久99精品国产| 精品国产亚洲日本| 亚洲欧美视频| 97国产精品| 日韩av不卡在线观看| 美女网站一区| 国产精品magnet| 一区久久精品| 国产精品毛片视频| 免费视频国产一区| 久久亚洲黄色| 免费看日韩精品| 黑人精品一区| 男女激情视频一区| 精品国产一区二区三区av片| 影音先锋国产精品| 麻豆视频在线观看免费网站黄 | 日韩综合在线| 日本不卡不码高清免费观看| 久久理论电影| 欧美www视频在线观看| 日韩高清在线观看一区二区| 影音国产精品| 日韩精品一卡| 成人污污视频| 国产日韩一区二区三区在线播放| 国产一区导航| 久久精品免费一区二区三区| 日本视频中文字幕一区二区三区| 一区二区视频欧美| 欧美国产一级| 国产精品亚洲欧美一级在线| 亚洲毛片视频| 天使萌一区二区三区免费观看| 久久国产中文字幕| 中文字幕在线高清| 久久亚洲人体| 国产欧美啪啪| 日韩有码av| 婷婷综合网站| 久久99青青| 日韩国产在线观看| 99综合视频| 亚洲播播91| 色婷婷综合网| 成人精品动漫一区二区三区| 国产精品亚洲一区二区在线观看| 日本亚州欧洲精品不卡| 伊人影院久久| 亚洲成人日韩| 久久中文字幕av一区二区不卡| 国产91在线播放精品| 欧美国产日韩电影| 蜜桃精品视频| 精品中文字幕一区二区三区| 久久免费影院| 另类欧美日韩国产在线| 国产亚洲欧美日韩在线观看一区二区 | 激情婷婷综合| 1000部精品久久久久久久久| 91看片一区| 久久久国产亚洲精品| 超碰99在线| 日本不卡免费高清视频在线| 青青青免费在线视频| 国产 日韩 欧美 综合 一区| 国产成人精品一区二区三区免费 | 欧美日韩a区| 国产精品一区二区三区av| 青青青国产精品| 国产一区 二区| 国产精品99精品一区二区三区∴| 麻豆一区二区三区| 国产成人精品三级高清久久91| 国内精品亚洲| 久久91导航| 尤物网精品视频| 中文字幕日韩欧美精品高清在线| 免费看精品久久片| 日韩国产一二三区| 欧美精品91| a天堂资源在线| 免费久久久久久久久| 美女久久一区| 日本不卡一区二区| 美女精品视频在线| 日韩深夜视频| 中文亚洲欧美| 日韩有码av| 精品久久福利| 在线日韩电影| 视频一区二区三区入口| 婷婷精品在线观看| 国产精品一区二区三区www| 精品网站999| 99视频精品全部免费在线视频| 美女国产一区| 国产精品成人一区二区网站软件| 久久精品欧美一区| 国产欧美日韩精品一区二区免费| 久久久精品五月天| 国产日产高清欧美一区二区三区| 午夜日韩在线| 国产成年精品| 欧美日韩va| 亚洲中字黄色| 日韩中文首页| 美女国产一区二区三区| 亚洲制服少妇|