在java项目中,如何限制每个用户访问接口的次数?

方法1:数据访问量大的话 用redis来做,用户在调用短信接口时,先根据用户id去查一下次数,如果没有id这个key,证明就是1分钟内首次发送,发送后,在redis中记录一个key为id的次数为一次,在为这个key加上过期时间1分钟


方法2:在filter层加一个过滤器,拦截所有的请求,解析出请求的用户,然后通过缓存,获取到该用户当前已访问次数,后面逻辑判断就不说了,主要问题其实是集中在缓存这里,其他的都不想干。
缓存,要求最好能够自动超时回收,也就是说比如你想设定三分钟内限制访问次数,那么你记录的缓存有效期就三分钟就好了,过了三分钟缓存自动失效,计数器也就重新从0开始了。
优先推荐redis,如果不想引入第三方工具,那么Guava Cache也就可以满足需求的。

3:用threadlocal,在request刚进入的时候(比如filter)保存用户数据,
然后在后面的方法上就可以拿到。可以通过aop来实现你的需求,这样可以做到统一。
我说一个最傻的方法,反正思路你拷贝到aop里面去也是一样的:
threadlocal已经有了这个用户信息(建议保存session)
这样你就能保存一分钟内访问了几次(session内部放一个map<接口信息名称(string),List<时间(long)>>)
比如每个接口都先调用一下某个方法,这个方法就是通过threadlocal取到session,如果session是null则表示可能是自动任务(也有可能是你那里代码没有按照我的思路写)
拿到了就可以计数控制了,如果超过了次数抛出自己的异常,然后在顶层捕获这个异常,就知道了是次数受限制了。该怎么输出信息提示用户自己看着办。
里面的那个map里面的list是需要不停的清理的,因为不清理越来越大,建议启动一个线程,清理掉一分钟前的那些数据。

我经常做类似这样的事。但是你的这个需求非常耗费性能,OA和ERP可以这么搞,我估计在线用户超过1w的系统这样做估计要挂掉,当然你server的性能牛B的没话说那我也没话说

你可能感兴趣的:(在java项目中,如何限制每个用户访问接口的次数?)