springMVC系列(六)——拦截器实现自定义注解接口访问限制
2017-05-16 18:49
615 查看
通过自定义注解形式实现接口访问评论限制
1.自定义注解,访问限制值和时间放在注解的参数中
RequestLimit.java注解
1.当拦截器获得客户端请求,redis生成根据组合code判断是否存在,
如果存在,取得计数器
a.如果计数器大于最大访问数量,return false;限制其访问
b.如果小于,计数器加1
如果不存在,创建一个带定时的、key为组合code的计数器,数字为1
3. 拦截器实现类代码
1.自定义注解,访问限制值和时间放在注解的参数中
RequestLimit.java注解
@Retention(RetentionPolicy.RUNTIME) public @interface RequestLimit { /** * * 允许访问的次数,默认值MAX_VALUE */ intcount() defaultInteger.MAX_VALUE; /** * * 时间段,单位为毫秒,默认值十分钟 */ longtime() default600000; }2.拦截器主要代码
1.当拦截器获得客户端请求,redis生成根据组合code判断是否存在,
如果存在,取得计数器
a.如果计数器大于最大访问数量,return false;限制其访问
b.如果小于,计数器加1
如果不存在,创建一个带定时的、key为组合code的计数器,数字为1
/** * 接口的访问频次限制 *@param request *@return */ private booleanvalidateCode(HttpServletRequest request,int maxSize, long timeOut){ Stringcode= request.getParameter("params"); Stringdatakey= "RequestLimit" + "Data"+ code; boolean vcode = true; redisUtils.incr(datakey); long count = redisUtils.incr(datakey); if (count == 1) { redisUtils.set(code, count, timeOut); } if(count> maxSize){ logger.info("用户[" + code+ "]超过了限定的次数[" + maxSize + "]"); vcode = false; } return vcode; }
3. 拦截器实现类代码
@Component public classRequestLimitInterceptor extends HandlerInterceptorAdapter { @Autowired private RedisUtils redisUtils; //redis缓存操作,可以用hash对象替代 @Override public boolean preHandle(HttpServletRequestrequest,HttpServletResponse response, Object handler){ RequestLimitmethodRequestLimit= ((HandlerMethod) handler).getMethodAnnotation(RequestLimit.class); //方法注解 RequestLimitclassRequestLimit= ((HandlerMethod) handler).getBean().getClass().getAnnotation(RequestLimit.class); //类注解 boolean vcode = true; if(methodRequestLimit!= null){ vcode = validateCode(request, methodRequestLimit.count(),methodRequestLimit.time()); }elseif(classRequestLimit!= null){ vcode = validateCode(request, classRequestLimit.count(), classRequestLimit.time()); } return vcode; } /** * 接口的访问频次限制 * @param request * @return */ private boolean validateCode(HttpServletRequestrequest,int maxSize, long timeOut) { Stringcode= request.getParameter("params"); Stringdatakey= "RequestLimit" + "Data"+ code; boolean vcode = true; redisUtils.incr(datakey); long count = redisUtils.incr(datakey); if (count == 1) { redisUtils.set(code, count, timeOut); } if (count > maxSize){ logger.info("用户[" + code+ "]超过了限定的次数[" + maxSize + "]"); vcode = false; } return vcode; } }配置拦截器
在springMVC配置文件中添加 <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/bls/*" /><!-- 如果不配置或/*,将拦截所有的Controller--> <beanclass="com.yoostar.support.interceptor.RequestLimitInterceptor" /> </mvc:interceptor> </mvc:interceptors>拦截接口加注解
相关文章推荐
- SpringMVC自定义注解和拦截器实现控制器访问次数限制
- SpringMVC自定义注解AOP实现控制器访问次数限制
- [SpringMVC]自定义注解实现控制器访问次数限制
- [SpringMVC]自定义注解实现控制器访问次数限制
- [SpringMVC]自定义注解实现控制器访问次数限制
- springMVC系列(五)——springMVC拦截器实现接口访问日志
- [SpringMVC]自定义注解实现控制器访问次数限制(转载)
- [SpringMVC]自定义注解实现控制器访问次数限制
- springmvc自定义注解拦截器方式实现注解功能拦截器的配置
- [SpringMVC+redis]自定义aop注解实现控制器访问次数限制
- 通过自定义注解或拦截器实现APP调用后接口全局权限验证
- SpringBoot中自定义注解实现控制器访问次数限制
- SpringBoot中自定义注解实现控制器访问次数限制
- SpringBoot中自定义注解实现控制器访问次数限制实例
- SpringMVC利用AOP实现自定义注解记录日志
- 通过自定义注解利用AOP在springmvc中实现记录日志
- 利用struts2拦截器加自定义注解实现权限控制
- SpringMVC 使用注解注入生成接口实现类对象
- SpringMVC验证框架Validation自定义注解实现传递参数到国际化资源文件
- SpringMVC利用AOP实现自定义注解记录日志