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

本文介绍了一种使用jfinal框架结合redis实现接口访问次数限制的方法。通过自定义注解和拦截器,能够有效地控制特定时间内同一IP地址对指定接口的访问频率。

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

下边博主使用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

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







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值