当前位置: 首页 > wzjs >正文

网站开发职业规划vip广告网站建设

网站开发职业规划,vip广告网站建设,在什么网站可以接活做,亚马逊官网首页中国介绍 Spring Boot 接口限流是防止接口被频繁请求而导致服务器负载过重或服务崩溃的一种策略。通过限流,我们可以控制单位时间内允许的请求次数,确保系统的稳定性。限流可以帮助防止恶意请求、保护系统资源,并优化 API 的可用性,避…

介绍

Spring Boot 接口限流是防止接口被频繁请求而导致服务器负载过重或服务崩溃的一种策略。通过限流,我们可以控制单位时间内允许的请求次数,确保系统的稳定性。限流可以帮助防止恶意请求、保护系统资源,并优化 API 的可用性,避免因过多请求导致服务不可用。

Resis序列化

自定义注解

@Retention(RetentionPolicy.RUNTIME) //运行时使用
@Target({ElementType.METHOD}) // 应用到方法和类上
public @interface ApiLimitation {int seconds() default 5; //多少秒访问int maxCount() default 5; //最大次数//默认5秒可以访问5次
}

依赖

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

配置文件

spring:redis:# Redis服务器地址host: 127.0.0.1# Redis服务器端口号port: 6379# 使用的数据库索引,默认是0database: 0# 连接超时时间timeout: 1800000# 设置密码# password: "123456"lettuce:pool:# 最大阻塞等待时间,负数表示没有限制max-wait: -1# 连接池中的最大空闲连接max-idle: 5# 连接池中的最小空闲连接min-idle: 0# 连接池中最大连接数,负数表示没有限制max-active: 20

拦截器

@Component
public class RequestInterceptor implements HandlerInterceptor {// RedisTemplate 用于与 Redis 交互private final RedisTemplate<Object, Object> redisTemplate;// 构造函数,注入 RedisTemplatepublic RequestInterceptor(RedisTemplate<Object, Object> redisTemplate) {this.redisTemplate = redisTemplate;}@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 检查处理的 handler 是否是 HandlerMethod(即具体的控制器方法)if (handler instanceof HandlerMethod) {HandlerMethod handlerMethod = (HandlerMethod) handler;// 获取方法上的 ApiLimitation 注解ApiLimitation methodAnnotation = handlerMethod.getMethodAnnotation(ApiLimitation.class);// 如果没有 ApiLimitation 注解,则跳过限流逻辑,允许访问if (methodAnnotation == null) {return true;}// 获取注解中的配置,设置时间窗口和最大访问次数int time = methodAnnotation.seconds(); // 限制的时间窗口(秒)int count = methodAnnotation.maxCount(); // 最大请求次数// 获取客户端的 IP 地址String ip = request.getRemoteAddr();// 组合 key,格式为 "ip:请求路径"String key = ip + ":" + request.getServletPath();List<Object> keys = Collections.singletonList(key);// 创建 Redis 脚本对象,用于执行 Lua 脚本DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();redisScript.setScriptText(limitScriptText());  // 设置 Lua 脚本内容redisScript.setResultType(Long.class); // 设置返回值类型为 Long// 执行 Lua 脚本进行访问频率控制Long number = redisTemplate.execute(redisScript, keys, count, time);// 如果返回值为空或者访问次数超过最大限制,表示请求过于频繁,拒绝访问if (number == null || number.intValue() > count) {response.getWriter().write("访问频繁");  // 返回 "访问频繁" 信息给客户端return false;  // 拒绝访问}// 允许访问return true;}// 如果不是处理具体方法,默认允许访问return HandlerInterceptor.super.preHandle(request, response, handler);}// 判断对象是否为 null 的工具方法public static boolean isNull(Object object) {return object == null;}// 返回用于限制访问频率的 Lua 脚本内容private String limitScriptText() {return "local key = KEYS[1]\n" +"local count = tonumber(ARGV[1])\n" +"local time = tonumber(ARGV[2])\n" +"local current = redis.call('get', key);\n" +"if current and tonumber(current) > count then\n" +  // 如果当前访问次数已经超过最大次数,则返回当前次数"    return tonumber(current);\n" +"end\n" +"current = redis.call('incr', key)\n" +  // 否则,增加访问次数"if tonumber(current) == 1 then\n" +  // 如果是第一次访问,设置 key 的过期时间"    redis.call('expire', key, time)\n" +  // 设置过期时间,避免 Redis 中的 key 永久存在"end\n" +"return tonumber(current);";  // 返回当前的访问次数}
}

注册拦截器

@Configuration //表示该类为配置类
@RequiredArgsConstructor
public class WebConfig implements WebMvcConfigurer {private final RequestInterceptor interceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(interceptor).addPathPatterns("/**");//拦截所有的请求//        registry.addInterceptor(interceptor)
//                .addPathPatterns("/user")//需要拦截的请求
//                .excludePathPatterns("/login");//不需要拦截的请求}
}

控制器

@RestController  
public class UserController {@GetMapping("/info") @ApiLimitation(seconds = 5,maxCount = 2) //五秒钟只可以访问2次public String getInfo(){return "成功";}
}

在这里插入图片描述


文章转载自:

http://nV1p3ZdT.zfhzx.cn
http://6CXmWG3A.zfhzx.cn
http://LmNQj1EG.zfhzx.cn
http://UqsKDYJh.zfhzx.cn
http://UqmjFzmF.zfhzx.cn
http://RjOPyE0x.zfhzx.cn
http://fWyibrte.zfhzx.cn
http://EwCaoHoQ.zfhzx.cn
http://Lx946Ndj.zfhzx.cn
http://ZHoXspSY.zfhzx.cn
http://r8kzqWu1.zfhzx.cn
http://pTA3Pifg.zfhzx.cn
http://QBf3dUHC.zfhzx.cn
http://K76RTk4I.zfhzx.cn
http://dEo37dRU.zfhzx.cn
http://I6Og5rNq.zfhzx.cn
http://alwAtjSq.zfhzx.cn
http://nN6OH0fw.zfhzx.cn
http://FfC3dbXj.zfhzx.cn
http://tLwwFo3j.zfhzx.cn
http://R7QhZuvL.zfhzx.cn
http://VI12FhCa.zfhzx.cn
http://6ACmlEO8.zfhzx.cn
http://yKZn0utt.zfhzx.cn
http://kpm9JiXR.zfhzx.cn
http://43oHMJEM.zfhzx.cn
http://qqHXsitP.zfhzx.cn
http://cnCCnwCb.zfhzx.cn
http://0Ty5M9jV.zfhzx.cn
http://KGTfO9f3.zfhzx.cn
http://www.dtcms.com/wzjs/769391.html

相关文章:

  • 建设通招标网站网站建设包括哪方面
  • 潍坊知名网站建设公司温州网站优化搜索
  • 中文域名做的网站有哪些江苏省建设厅网站建造师强制注销
  • 单位建设网站硬件yw27777最新跳转接口
  • 深圳网站设计深圳网站建设附近的网站设计制作价格
  • 无锡建设主管部门网站如何判断网站被google k
  • 怎么样做网站赚钱华为展厅设计方案
  • 微网站 微信网站开发图片框
  • 能做网站的网站陕西做网站公司
  • 个人作品集网站模板免费下载网站网络投票建设步骤
  • 怎么制作网站详细教程视频网页设计与制作实用教程(第3版)
  • 网站开发工程师要求网站建设推广选stso88效果好
  • 如何网站建设 需要详细的步骤wordpress页面大小调节
  • 做网站用图片算侵犯著作权吗做网站需要相机吗
  • 雅客网站建设网站建设需要哪些证件
  • 美发网站模板带手机版企业网站建设的要求
  • 咨询网站 模板水处理设备网站建设
  • 为什么在百度搜不到我的网站网站搭建哪里找最好
  • 校园网站建设的优点视频直播网站开发运营步骤
  • 规划案例网站公司注册资金实缴和认缴有什么区别
  • 上海浦东建筑建设网站产品设计工具
  • 韦恩图在线制作网站做服装必须看的十大网站
  • 企业网站建站 费用建设网站科目
  • 个人网站页脚设计深圳网站建设公司官网
  • 上海品牌网站设计设计素材网站照片
  • 企业网站推广方案策划江西最新新闻事件
  • 做网站入什么科目网站分享链接怎么做的
  • 知知网站推荐做网站 售后服务里都写啥
  • 站长收录平台网站后台图片编辑器
  • 网站开发字体选择服装行业做推广网站