概述
通过自定义注解形式实现接口访问评论限制
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系列(六)——拦截器实现自定义注解接口访问限制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复