Java项目中,如何限制每个用户访问接口的次数 使用过滤器 写代码
时间: 2024-03-01 16:53:15 浏览: 171
好的,下面是一个简单的使用过滤器限制每个用户访问接口次数的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/` 开头的接口时才会触发该过滤器。
这样,我们就成功实现了使用过滤器限制每个用户访问接口次数的功能。
阅读全文