java实现接口防刷功能
注解实现
功能:防止用户过快地重复请求,从而可能导致的系统压力或资源滥用
逻辑:直接上代码再解释。
- 注解类
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AntiBrush {
long time() default 30000; // 防刷时间,默认30秒
}
- 拦截器
@Component
public class AntiBrushInterceptor implements HandlerInterceptor {
private final Map<String, Long> userTimestamps = new ConcurrentHashMap<>();
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
AntiBrush antiBrush = handlerMethod.getMethodAnnotation(AntiBrush.class);
if (antiBrush != null) {
String userId = request.getHeader("userId"); // 获取用户标识
Long lastTimestamp = userTimestamps.get(userId);
long currentTime = System.currentTimeMillis();
if (lastTimestamp != null && currentTime - lastTimestamp < antiBrush.time()) {
// 如果用户在指定时间内访问,则认为是刷新操作
response.setStatus(HttpStatus.FORBIDDEN.value()); // 设置HTTP状态码为403
return false;
}
userTimestamps.put(userId, currentTime);
}
}
return true;
}
}
第二步解释:
@Component:告诉Spring容器这个类是一个组件,需要在Spring应用启动时自动创建其实例并管理。Spring会负责AntiBrushInterceptor的实例化,并将其注册为请求拦截器
new ConcurrentHashMap<>():这是一个线程安全的Map,用于存储用户唯一标识和它们最后一次请求的时间戳ConcurrentHashMap确保了在多线程环境下的并发访问安全
参数HttpServletRequest request和HttpServletResponse response:分别代表当前的HTTP请求和响应对象。
参数Object handler是即将被调用的处理器对象,它可能是任何类型的处理器,但在这个拦截器中,我们只关心它是否是HandlerMethod的实例,即一个被Spring MVC封装的处理器方法。
在方法内部,首先检查处理器是否标注了@AntiBrush注解。@AntiBrush是一个自定义注解,用于标记那些需要防止用户过快重复请求的方法。
如果处理器方法被@AntiBrush注解标记,拦截器会获取请求头中的userId(用户唯一标识),然后检查这个用户上一次请求的时间戳。
如果用户在@AntiBrush注解指定的时间间隔内再次请求,拦截器会将HTTP响应的状态码设置为403(根据自己需求调整状态码),并返回false,表示请求不应继续被处理,如果遇到多次请求的ip可将其记录并新建黑名单进行特殊处理
3.注解使用
@PostMapping("/login")
//@AntiBrush(time = 10000) 接口防刷注解
public void login(@RequestBody UUserEntity UUserEntity) {
}

1458

被折叠的 条评论
为什么被折叠?



