jfinal 注解@interface,接口访问次数限制

在开发中,难免会遇到接口的访问次数限制等功能,比如防止狂刷,验证码的请求次数限制等。

下边博主使用jfinal + redis实现了这一个功能。

首先创建@interface类

import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface RequestLimit {
    /**
     * 
     * 允许访问的次数,默认值MAX_VALUE
     */
    long count() default Integer.MAX_VALUE;
 
    /**
     * 
     * 时间段,单位为秒,默认值一分钟
     */
    int time() default 60;
}
然后创建拦截器 .
import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.redis.Cache;
import com.jfinal.plugin.redis.Redis;
import com.sunjs.utils.IpUtils;
 
/**
 * LimitInterceptor.
 */
public class LimitInterceptor implements Interceptor {
     
    public void intercept(Invocation inv) {
        RequestLimit limit = inv.getMethod().getAnnotation(RequestLimit.class);
        if (limit != null){
            long count = limit.count();
            int time = limit.time();
             
            String ip = IpUtils.getIpAddr(inv.getController().getRequest());
             
            String uri = inv.getController().getRequest().getRequestURI();
             
            /** 操作redis cache **/
            String cacheKey = "visit_limit_"+uri+"_"+ip;
            Cache cache = Redis.use(PropKit.get("redis.cachename"));
            Long visitNum = cache.incr(cacheKey);
            if(visitNum==1){
                //第一次访问需要在redis中增加过期时间
                cache.expire(cacheKey, time);
            }
            if (visitNum > count) {  
                inv.getController().renderJson("请求次数频繁,请稍后重试");
                return ;
            }  
        }
        inv.invoke();
    }
     
}

获取ip的工具类这里就不公布了,网上一搜一大堆。

具体如何限制访问次数,自己去扩展吧,比如返回页面,返回json,或者输入验证码才可以进行下一步....

记得在config启动加载中配置此拦截器

public void configInterceptor(Interceptors me) {
        me.add(new LimitInterceptor());
    }
配置redis插件:
public void configPlugin(Plugins me) {
         
        // 用于缓存博客模块的redis服务
        RedisPlugin newsRedis = new RedisPlugin(PropKit.get("redis.cachename"),
                PropKit.get("redis.host"), PropKit.getInt("redis.port"),
                PropKit.getInt("redis.timeout"), PropKit.get("redis.password"));
        me.add(newsRedis);
    }

然后在请求方法中就可以注解了,很简单的小例子。

@RequestLimit(count=60, time=60)  //60秒请求次数限制60次



更多详细讲解和文章请到个人博客查看


版权属于: 技术客

原文地址: https://www.sunjs.com/article/detail/04118233795a4c08af221d0ca32e2126.html

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。







你可能感兴趣的:(程序人生)