在开发Web应用时,我们常常需要对某些接口设置访问频率限制,以防止恶意请求或过载问题。今天就来聊聊如何用SpringMVC结合自定义注解与拦截器实现这一功能!💻✨
首先,创建一个自定义注解`@AccessLimit`,用于标记需要限制访问次数的方法。例如:
```java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AccessLimit {
int seconds(); // 限制时间间隔(秒)
int maxCount(); // 最大允许访问次数
}
```
接着,在拦截器中解析该注解并统计请求次数。如果超出限制,则返回错误提示。Interceptor逻辑如下:
```java
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod method = (HandlerMethod) handler;
AccessLimit accessLimit = method.getMethodAnnotation(AccessLimit.class);
if (accessLimit != null) {
// 根据用户IP和方法名生成唯一key
String key = request.getRequestURI();
Integer count = redisService.get(key);
if (count == null) count = 1;
else if (count > accessLimit.maxCount()) {
throw new RuntimeException("访问过于频繁,请稍后再试!");
} else {
redisService.set(key, count + 1, accessLimit.seconds());
}
}
}
return true;
}
```
通过这种方式,我们不仅实现了灵活的访问控制,还提升了系统的健壮性。快去试试吧!🚀💨