Java项目中,如何限制每个用户访问接口的次数 一小时访问一次 使用过滤器 写代码
时间: 2024-03-01 22:54:15 浏览: 182
可以通过自定义过滤器来实现限制每个用户访问接口的次数,以下是一个Java项目中使用过滤器限制每个用户一小时内只能访问一次的示例代码:
```java
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class LimitFilter implements Filter {
// 存储每个用户上次访问时间的Map,key为用户ID,value为上次访问时间
private Map<String, Long> lastVisitedTimeMap = new HashMap<>();
// 最大允许访问次数
private static final int MAX_VISIT_COUNT = 1;
// 时间限制(毫秒),这里设置为1小时
private static final long TIME_LIMIT = 60 * 60 * 1000;
public void init(FilterConfig config) throws ServletException {
// 初始化操作
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
String userId = getUserId(request); // 获取用户ID
if (userId != null) {
long currentTime = System.currentTimeMillis();
Long lastVisitedTime = lastVisitedTimeMap.get(userId);
if (lastVisitedTime == null || currentTime - lastVisitedTime >= TIME_LIMIT) {
// 如果用户从未访问过或者距离上次访问时间超过了限制时间
lastVisitedTimeMap.put(userId, currentTime);
chain.doFilter(request, response); // 继续执行过滤器链
} else {
// 如果用户访问次数超过了限制
response.getWriter().write("您的访问次数已达到上限,请一个小时后再试!");
}
} else {
// 如果无法获取用户ID,直接继续执行过滤器链
chain.doFilter(request, response);
}
}
public void destroy() {
// 销毁操作
}
private String getUserId(HttpServletRequest request) {
// 获取用户ID的方法,可以根据实际情况自行编写
// 这里假设用户ID存储在请求头中的Authorization字段中
return request.getHeader("Authorization");
}
}
```
上述代码中,我们使用了一个HashMap来存储每个用户上次访问时间,过滤器每次处理请求都会从请求中获取用户ID,然后根据用户ID在Map中查找上次访问时间,如果上次访问时间距离当前时间超过了限制时间,则更新Map中的访问时间,并继续执行过滤器链;否则返回提示信息,不再继续执行过滤器链。注意,这里我们假设用户ID存储在请求头中的Authorization字段中,实际情况中可能需要根据具体的业务需求进行修改。
阅读全文