如何使用过滤器 过滤单独接口 限制访问次数 每小时访问一次 写代码
时间: 2024-01-21 10:02:27 浏览: 35
好的,下面是一个简单的使用过滤器限制接口访问次数的示例代码,该示例限制了每小时访问一次:
```java
public class RateLimitFilter implements Filter {
private static final int MAX_REQUESTS_PER_HOUR = 1;
private static final int ONE_HOUR_IN_MILLISECONDS = 60 * 60 * 1000;
private Map<String, Integer> requestCountMap = new HashMap<>();
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化操作,可以在这里获取一些配置信息等
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
String requestUri = httpRequest.getRequestURI();
String ipAddress = httpRequest.getRemoteAddr();
String key = requestUri + ":" + ipAddress;
int requestCount = requestCountMap.getOrDefault(key, 0);
if (requestCount >= MAX_REQUESTS_PER_HOUR) {
httpResponse.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());
httpResponse.getWriter().write("Too many requests");
return;
}
requestCountMap.put(key, requestCount + 1);
chain.doFilter(request, response);
}
@Override
public void destroy() {
// 销毁操作,可以在这里释放一些资源等
}
}
```
在上面的代码中,首先定义了一个最大请求次数和一个一小时的毫秒数常量。然后在doFilter()方法中,获取请求的URI和IP地址,并将它们作为key存储在一个Map中,用于统计每个接口每小时的请求次数。如果请求次数超过了最大请求次数,就返回一个状态码为429的响应。如果请求次数没有超过最大请求次数,就将请求次数加1,并继续执行Filter链。
最后,在web.xml中配置Filter,指定要拦截的接口和Filter的类名。例如:
```xml
<filter>
<filter-name>RateLimitFilter</filter-name>
<filter-class>com.example.RateLimitFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>RateLimitFilter</filter-name>
<url-pattern>/api/myInterface</url-pattern>
</filter-mapping>
```
这样,就可以对访问/api/myInterface接口的请求进行限制,每小时只能访问一次。