【java实现接口防刷功能】

java实现接口防刷功能

注解实现

功能:防止用户过快地重复请求,从而可能导致的系统压力或资源滥用
逻辑:直接上代码再解释。

  1. 注解类
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AntiBrush {
    long time() default 30000; // 防刷时间,默认30秒
}
  1. 拦截器
@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) {

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WGY_NOBUG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值