我是靠谱客的博主 俊秀发夹,最近开发中收集的这篇文章主要介绍springMVC系列(六)——拦截器实现自定义注解接口访问限制,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

通过自定义注解形式实现接口访问评论限制

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系列(六)——拦截器实现自定义注解接口访问限制所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部