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

转自:https://blog.csdn.net/qq_30947533/article/details/78844709

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


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

 

转载于:https://www.cnblogs.com/rocker-pg/p/9120466.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的使用过滤器限制每个用户访问接口次数Java代码示例: 首先,创建一个名为 `ApiAccessLimitFilter` 的过滤器类,代码如下: ```java import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class ApiAccessLimitFilter implements Filter { private static final int MAX_ACCESS_COUNT = 10; // 每个用户最大访问次数 private static final String CACHE_PREFIX = "api_access_count_"; // 缓存键前缀 private CacheManager cacheManager; // 缓存管理器 @Override public void init(FilterConfig filterConfig) throws ServletException { // 初始化缓存管理器,这里使用Ehcache作为缓存实现 cacheManager = CacheManager.create(); cacheManager.addCache("api_access_count_cache"); } @Override public void destroy() { // 关闭缓存管理器 cacheManager.shutdown(); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; String userId = getUserId(httpRequest); // 获取用户ID String cacheKey = CACHE_PREFIX + userId; // 构造缓存键 // 从缓存获取用户访问计数器 Element element = cacheManager.getCache("api_access_count_cache").get(cacheKey); int accessCount = element != null ? (int) element.getValue() : 0; if (accessCount >= MAX_ACCESS_COUNT) { // 如果用户访问次数超过限制 httpResponse.setStatus(429); // 返回 HTTP 429 Too Many Requests 状态码 return; } // 用户访问次数加1,并更新缓存 accessCount++; Element newElement = new Element(cacheKey, accessCount); cacheManager.getCache("api_access_count_cache").put(newElement); chain.doFilter(request, response); // 继续处理请求 } private String getUserId(HttpServletRequest request) { // 这里假设从请求头获取用户ID return request.getHeader("user-id"); } } ``` 以上代码,我们使用了一个 `CacheManager` 对象来管理缓存,这里使用了开源的 Ehcache 实现。在 `init` 方法初始化了 `CacheManager` 对象和一个名为 `api_access_count_cache` 的缓存实例。在 `doFilter` 方法,我们首先通过 `getUserId` 方法获取用户ID,然后构造一个缓存键 `cacheKey`,并从缓存获取该用户访问计数器。如果用户访问次数超过了限制,直接返回 HTTP 429 Too Many Requests 状态码。否则,将用户访问次数加1,并更新缓存。最后,调用 `chain.doFilter(request, response)` 方法继续处理请求。 接下来,在 `web.xml` 文件注册该过滤器,代码如下: ```xml <filter> <filter-name>ApiAccessLimitFilter</filter-name> <filter-class>com.example.ApiAccessLimitFilter</filter-class> </filter> <filter-mapping> <filter-name>ApiAccessLimitFilter</filter-name> <url-pattern>/api/*</url-pattern> </filter-mapping> ``` 以上代码,我们将该过滤器注册到了所有以 `/api/` 开头的 URL 上,即只有访问 `/api/` 开头的接口时才会触发该过滤器。 这样,我们就成功实现了使用过滤器限制每个用户访问接口次数的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值