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

中国十大设计素材网站中国电信企业邮箱登录入口

中国十大设计素材网站,中国电信企业邮箱登录入口,北京最大的装修公司排名,栖霞网站建设目录 一、需求二、实现思路三、代码实现3.1 导入依赖3.2 配置redis3.3 自定义注解3.4 定义切面类3.5 自定义异常类3.6 全局异常处理器 一、需求 在我们程序中,有时候需要对一些接口做访问控制,使程序更稳定,最常用的一种是通过ip限制&#x…

目录

  • 一、需求
  • 二、实现思路
  • 三、代码实现
    • 3.1 导入依赖
    • 3.2 配置redis
    • 3.3 自定义注解
    • 3.4 定义切面类
    • 3.5 自定义异常类
    • 3.6 全局异常处理器

一、需求

在我们程序中,有时候需要对一些接口做访问控制,使程序更稳定,最常用的一种是通过ip限制,还有一种是通过用户名限制,也可以把一个接口限制死,在一段时间内只能访问多少次,这个根据自己需求来,不固定。在需要做限制的方法上加上一个自定义注解,用aop获取到这个方法,利用redis中的increment方法,去计数访问次数,超过访问次数,return一个自定义异常。

二、实现思路

选用的是hash结构类型去存储访问次数,用访问路径作为外层key,ip作为内层key,访问次数作为value。

  1. 首先根据id从redis中取出访问次数。
  2. 如果是第一次访问就添加到redis当中,value设置为1,如果不是第一次访问就判断是否在规定访问次数内
  3. 返回结果

三、代码实现

3.1 导入依赖

		 <!--aop依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!--redis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

3.2 配置redis

声明配置类

@Configuration
public class RedisConfig {@Bean@SuppressWarnings(value = { "unchecked", "rawtypes" }) //屏蔽一些无关紧张的警告public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory connectionFactory){RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();//GenericJackson2JsonRedisSerializer比Jackson2JsonRedisSerializer效率低//GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();Jackson2JsonRedisSerializer jsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);redisTemplate.setConnectionFactory(connectionFactory);// 使用StringRedisSerializer来序列化和反序列化redis的key值redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(jsonRedisSerializer);//Hash的key也采用StringRedisSerializer的序列化方式redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(jsonRedisSerializer);redisTemplate.afterPropertiesSet();return redisTemplate;}
}

application.yml配置

spring:# redis配置redis:host: localhostport: 6379database: 0 #默认连接0号数据库

3.3 自定义注解

/*** 接口访问频率注解,默认一分钟只能访问5次*/
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AccessLimit {long time() default 60000;  限制时间 单位:毫秒(默认值:一分钟)int value() default 5;// 允许请求的次数(默认值:5次)
}

3.4 定义切面类

@Aspect
@Component
@Slf4j
public class InterfaceLimitAspect {@Autowiredprivate RedisTemplate redisTemplate;@Pointcut("@annotation(accessLimit)")public void pt(AccessLimit accessLimit){}@Around("pt(accessLimit)")public Object Around(ProceedingJoinPoint joinPoint,AccessLimit accessLimit) throws Throwable {// 获得request对象ServletRequestAttributes sra =(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = sra.getRequest();log.info(request.getRequestURI());//redis这里推荐使用hash类型,url为外层key,ip作为内层key,访问次数作为valueBoundHashOperations hashOps = redisTemplate.boundHashOps("interfaceLimit:"+request.getRequestURI());//获取ip获取接口访问次数Integer ipCount = (Integer)hashOps.get(request.getRemoteAddr());Integer count = ipCount==null?0:ipCount;//判断访问次数是否大于限制的次数if(count>=accessLimit.value()){//超过次数,不执行目标方法log.error("接口拦截:{} 请求超过限制频率【{}次/{}ms】,IP为{}",request.getRequestURI(),accessLimit.value(),accessLimit.time(),request.getRemoteAddr());throw new AccessLimitException(ResultCodeEnum.ACCESS_LIMIT);}else{//请求时,设置有效时间, 记录加一hashOps.increment(request.getRemoteAddr(),1);hashOps.expire(accessLimit.time()*5, TimeUnit.MILLISECONDS);}Object result = joinPoint.proceed();return result;}
}

3.5 自定义异常类

public class AccessLimitException extends RuntimeException{private Integer code;private String message;public Integer getCode(){return code;}public String getMessage(){return message;}public AccessLimitException(ResultCodeEnum resultCodeEnum){super(resultCodeEnum.getMessage());this.code = resultCodeEnum.getCode();this.message = resultCodeEnum.getMessage();}
}

3.6 全局异常处理器

@RestControllerAdvice
@Slf4j
public class HandlerException {@ExceptionHandler(Exception.class)public Result handle(Throwable e){log.info(e.getMessage());return Result.build(null, 507,"系统错误");}@ExceptionHandler(AccessLimitException.class)public Result AccessHandle(AccessLimitException e){log.error(e.getMessage());return Result.build(null,e.getCode(),e.getMessage());}
}
http://www.yayakq.cn/news/955020/

相关文章:

  • 一个企业做网站的意义电工证如何做的相关网站能查到
  • 会展免费网站模板住房和城乡建设部官网进行查询
  • 建一个网站模板网wordpress登录后台
  • 网站备案需要关闭网站吗网络营销有哪些模式
  • 网站源码在线下载潍坊网站制作小程序
  • 有没有代做毕业设计的网站网站规划与网页设计第四版电子书
  • 做网站一般做几个尺寸wordpress悬浮搜索
  • 上海网站优化加盟帝国视频网站模板
  • 做个卖车票的网站怎么做app软件开发成本
  • 电脑上制作网站的软件网站建设优惠
  • 营销型网站建设的意义北京网站建设优化学校
  • 山西网站建设服务公司深圳龙华天气
  • 网站建设企业文化wordpress 代码大全
  • 男女做暧暧网站免费做汽车配件网站的公司
  • 凡科网小程序怎么样优化网站搭建
  • 大港网站建设公司制作网页怎样添加背景音乐
  • 桂林市住房和城乡建设局网站网站建设20推广
  • 深圳设计公司办公室装修设计长沙网站优化方法
  • 建设网站注意事项燕郊做网站的公司
  • 微网站建设找哪家招聘网站设计师要求
  • 石景山做网站的公司敦化市建设局网站
  • 替别人做网站微信小程序如何搭建
  • 专业深圳网站定制开发济南网站建设公
  • 台州本地做网站的做外贸的网站有哪几个
  • 哪个网站抢注域名快wordpress增加下载功能
  • 高品质的佛山网站建设柳州市网站建设公司
  • 申请网站价格php 茶叶网站建设
  • 网站系统使用说明书免费ppt模版网站
  • 雄安移动网站建一个网站首先要怎么做
  • 淘宝装修免费模板有哪些网站无锡品牌网站建设介绍