网站域名设计方案,安阳做网站公司,网站建设实施计划包括哪些方面,口碑营销的定义目录
#x1f378;前言
#x1f37b;一、实现方法
#x1f37a;二、伪代码实现
#x1f379;三、章末 #x1f378;前言 小伙伴们大家好#xff0c;上次写了一篇文章记录了最近自己装台式电脑中遇到的问题#xff0c;以及整体的安装步骤和本地的配置选择#xff0c…
目录
前言
一、实现方法
二、伪代码实现
三、章末 前言 小伙伴们大家好上次写了一篇文章记录了最近自己装台式电脑中遇到的问题以及整体的安装步骤和本地的配置选择文章链接如下
【电脑组装】✈️从配置拼装到安装系统组装自己的台式电脑-CSDN博客 这次继续更新平时开发时可能会使用到的常见技术相信大家在开发时都会用到权限校验通过此方式可以增强系统安全比人使最常使用的校验工具就是JWT的token校验就是通过后端服务器生成token,后续请求需要携带该参数进行校验但是总会存在一部分接口不需要校验但是就会面临接口被刷等问题 防刷接口也有很多解决方案本地挑一个常见的 IP 限流通过记录请求的所属地址短时间内限制多次请求这样可以实现简单的流量控制
一、实现方法 这种实现方式有很多就拿使用较多的 AOP 切面吧因为最近了解到切面编程的另一种使用形式在之前使用较多的方式是定义一个注解在切面类中使用Pointcut 标注刚自定义的注解表示以下逻辑针对该注解起作用然后在项目中需要使用的地方加上自定义注解即可还有一种方式是鄙人最近在开发过程中淘到的起因是要在原有的限流基础上改动一点逻辑但是由于对项目的不熟悉翻来翻去也没找到之前限流的入口以为是自定义注解最后在aop包下发现一个名字比较符合的类LimitInterf...,点进去一看很熟悉就是切面类逻辑但是又有一点不同这里没有标明针对的注解而是使用路径的方式来控制整个 controller 中的请求方法怪不得请求层找不到相关注解
二、伪代码实现 本地简单使用伪代码介绍下这种切面的实现方式比较简单看一下定义阶段即可为什么不展示完整实现并测试因为鄙人最近在测试悟空尤为过瘾不是...尤为紧迫时间安排不过来...,醉翁之意不在酒能ctrl CV即可 代码结构如下 1.controller层请求进来后首先获取该请求的路径之后获取访问用户的ip,将请求路径拼接ip 作为唯一标识到redis中查询访问次数如果达到设置的上限抛出异常提示已限制如果是第一次访问则设置相应的过期时间 2.Component 注解将当前类声明为组件项目启动时会自动扫描 Aspect 注解是切面式编程中的重要注解标明为切面逻辑类 3.引入redis 作为分布式计数工具用户每次访问都要记录并且将结果缓存到redis中下次再访问时先进行是否达到限制 4.注入Servlet工具获取每次请求的具体路径用来计数 5. Pointcut(value execution(* com.test.controller.app.*Controller*.*(..)))这里是指包含test.controller 包下的所有以Controller结尾的类下的所有方法都需要经过该逻辑类校验适用于统一管理下的切面实现不用给每个请求方法上加注解 Component
Aspect
Slf4j
public class InterfaceLimitAspect {Autowiredprivate RedissonClient redissonClient;Autowiredprivate HttpServletRequest httpServletRequest;Pointcut(value execution(* com.test.controller.app.*Controller*.*(..)))public void point() {}private final Integer INTERFACELIMITCOUNT 10;private final Integer INTERFACELIMITTIME 10;Before(point())public void before() {try {String servletPath httpServletRequest.getServletPath();String ipAddr IpUtil.getIpAddr(httpServletRequest);RAtomicLong atomicLong redissonClient.getAtomicLong(servletPath : ipAddr);if (atomicLong.get() INTERFACELIMITCOUNT) {log.info(接口限流{}, servletPath : ipAddr);throw new Exception(try later);} else {atomicLong.incrementAndGet();if (atomicLong.get() 1) {atomicLong.expire(INTERFACELIMITTIME,TimeUnit.HOURS);}}} catch (Exception e) {log.error(接口限流异常, e);}}
}
三、章末 文章到这里就结束了~