前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >springMVC系列(六)——拦截器实现自定义注解接口访问限制

springMVC系列(六)——拦截器实现自定义注解接口访问限制

作者头像
逝兮诚
发布2019-10-30 13:14:33
9870
发布2019-10-30 13:14:33
举报
文章被收录于专栏:代码人生代码人生

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/luo4105/article/details/72327249

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

1.自定义注解,访问限制值和时间放在注解的参数中

RequestLimit.java注解

代码语言:javascript
复制
@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

代码语言:javascript
复制
/**
 * 接口的访问频次限制
 *@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. 拦截器实现类代码

代码语言:javascript
复制
@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;
    }
}

配置拦截器

代码语言:javascript
复制
在springMVC配置文件中添加
<mvc:interceptors>     
   <mvc:interceptor>     
      <mvc:mapping path="/bls/*" /><!-- 如果不配置或/*,将拦截所有的Controller-->
      <beanclass="com.yoostar.support.interceptor.RequestLimitInterceptor" />
   </mvc:interceptor>
</mvc:interceptors>

拦截接口加注解

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-05-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档