您的位置:首页 > 编程语言 > Java开发

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

2017-05-16 18:49 615 查看
通过自定义注解形式实现接口访问评论限制

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>
拦截接口加注解

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: