电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:2日期: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
相關文章:
主站蜘蛛池模板: 丝杆升降机-不锈钢丝杆升降机-非标定制丝杆升降机厂家-山东鑫光减速机有限公司 | 篮球地板厂家_舞台木地板品牌_体育运动地板厂家_凯洁地板 | 卫生型双针压力表-高温防腐差压表-安徽康泰电气有限公司 | 干式变压器厂_干式变压器厂家_scb11/scb13/scb10/scb14/scb18干式变压器生产厂家-山东科锐变压器有限公司 | 德州网站制作 - 网站建设设计 - seo排名优化 -「两山建站」 | 缠膜机|缠绕包装机|无纺布包装机-济南达伦特机械设备有限公司 | 便携式表面粗糙度仪-彩屏硬度计-分体式粗糙度仪-北京凯达科仪科技有限公司 | 登车桥动力单元-非标液压泵站-非标液压系统-深圳市三好科技有限公司 | 【电子厂招聘_普工招工网_工厂招聘信息平台】-工立方打工网 | R507制冷剂,R22/R152a制冷剂厂家-浙江瀚凯制冷科技有限公司 | 吲哚菁绿衍生物-酶底物法大肠菌群检测试剂-北京和信同通科技发展有限公司 | STRO|DTRO-STRO反渗透膜(科普)_碟滤| 泰国试管婴儿_泰国第三代试管婴儿费用|成功率|医院—新生代海外医疗 | 玖容气动液压设备有限公司-气液增压缸_压力机_增压机_铆接机_增压器 | 山东锐智科电检测仪器有限公司_超声波测厚仪,涂层测厚仪,里氏硬度计,电火花检漏仪,地下管线探测仪 | 净化板-洁净板-净化板价格-净化板生产厂家-山东鸿星新材料科技股份有限公司 | 商标转让-商标注册-商标查询-软著专利服务平台 - 赣江万网 | 污水处理设备-海普欧环保集团有限公司| 祝融环境-地源热泵多恒系统高新技术企业,舒适生活环境缔造者! | 手持式浮游菌采样器-全排二级生物安全柜-浙江孚夏医疗科技有限公司 | 杭州货架订做_组合货架公司_货位式货架_贯通式_重型仓储_工厂货架_货架销售厂家_杭州永诚货架有限公司 | 进口试验机价格-进口生物材料试验机-西安卡夫曼测控技术有限公司 | 软文发布-新闻发布推广平台-代写文章-网络广告营销-自助发稿公司媒介星 | 气力输送_输送机械_自动化配料系统_负压吸送_制造主力军江苏高达智能装备有限公司! | 缠膜机|缠绕包装机|无纺布包装机-济南达伦特机械设备有限公司 | 西安耀程造价培训机构_工程预算实训_广联达实作实操培训 | 山东活动策划|济南活动公司|济南公关活动策划-济南锐嘉广告有限公司 | 奇酷教育-Python培训|UI培训|WEB大前端培训|Unity3D培训|HTML5培训|人工智能培训|JAVA开发的教育品牌 | 横河变送器-横河压力变送器-EJA变送器-EJA压力变送器-「泉蕴仪表」 | 珠海白蚁防治_珠海灭鼠_珠海杀虫灭鼠_珠海灭蟑螂_珠海酒店消杀_珠海工厂杀虫灭鼠_立净虫控防治服务有限公司 | 空压机网_《压缩机》杂志 | 云南丰泰挖掘机修理厂-挖掘机维修,翻新,再制造的大型企业-云南丰泰工程机械维修有限公司 | 球形钽粉_球形钨粉_纳米粉末_难熔金属粉末-广东银纳官网 | 预制围墙_工程预制围墙_天津市瑞通建筑材料有限公司 | 上海瑶恒实业有限公司|消防泵泵|离心泵|官网 | 苏州工作服定做-工作服定制-工作服厂家网站-尺品服饰科技(苏州)有限公司 | LED灯杆屏_LED广告机_户外LED广告机_智慧灯杆_智慧路灯-太龙智显科技(深圳)有限公司 | 真空吸污车_高压清洗车厂家-程力专用汽车股份有限公司官网 | 钢格板|镀锌钢格板|热镀锌钢格板|格栅板|钢格板|钢格栅板|热浸锌钢格板|平台钢格板|镀锌钢格栅板|热镀锌钢格栅板|平台钢格栅板|不锈钢钢格栅板 - 专业钢格板厂家 | SF6环境监测系统-接地环流在线监测装置-瑟恩实业 | 彩信群发_群发彩信软件_视频短信营销平台-达信通 |