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

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

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

RequestLimit.java注解

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/** * 接口的访问频次限制 *@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. 拦截器实现类代码

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
@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; } }
配置拦截器

复制代码
1
2
3
4
5
6
7
在springMVC配置文件中添加 <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/bls/*" /><!-- 如果不配置或/*,将拦截所有的Controller--> <beanclass="com.yoostar.support.interceptor.RequestLimitInterceptor" /> </mvc:interceptor> </mvc:interceptors>
拦截接口加注解


最后

以上就是俊秀发夹最近收集整理的关于springMVC系列(六)——拦截器实现自定义注解接口访问限制的全部内容,更多相关springMVC系列(六)——拦截器实现自定义注解接口访问限制内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部