Java如何限制前端重复请求
作者:SunnyJourney
时间:2023-04-29
来源:互联网
浏览:0
背景及用途前端页面出现卡顿,用户反复点击操作按钮,导致后台接口短时间内多次提交实现步骤设置切面,增加注解,导致在规定时间内该接口不可重复调用设置一个接口NoRepeatSubmitimportjava.lang.annotation.*;/***xzj_2022_8_2*重复请求限制切面*/@Target(ElementType.METHOD)//注解放置的目标位置,METHOD是可注解在方法级别上@Retention(RetentionPolicy.RUNTIME)//注解在哪个阶段执行@Documen
背景及用途
前端页面出现卡顿,用户反复点击操作按钮,导致后台接口短时间内多次提交
实现步骤
设置切面,增加注解,导致在规定时间内该接口不可重复调用
设置一个接口 NoRepeatSubmit
import java.lang.annotation.*;
/**
* xzj_2022_8_2
* 重复请求限制切面
*/
@Target(ElementType.METHOD) //注解放置的目标位置,METHOD是可注解在方法级别上
@Retention(RetentionPolicy.RUNTIME) //注解在哪个阶段执行
@Documented //生成文档
public @interface NoRepeatSubmit {
String name() default "name:";
}实现类
import java.lang.annotation.*;
/**
* xzj_2022_8_2
* 重复请求限制切面
*/
@Target(ElementType.METHOD) //注解放置的目标位置,METHOD是可注解在方法级别上
@Retention(RetentionPolicy.RUNTIME) //注解在哪个阶段执行
@Documented //生成文档
public @interface NoRepeatSubmit {
String name() default "name:";
}使用
@GetMapping(value = "/test")
@NoRepeatSubmit
public void test() {
System.out.println("test");
}补充:下面看下java防止前端重复提交
JAVA利用自定义本地锁解决重复提交的问题
1.引入jar包
com.google.guava guava 31.1-jre
2.自定义本地锁
package com.hzt.listener;
import java.lang.annotation.*;
/**
* 自定义-控制重复提交锁
*/
@Target(ElementType.METHOD) //作用于方法
@Retention(RetentionPolicy.RUNTIME) //运行时有效
@Documented
@Inherited
public @interface LocalLock {
String key() default "";
}3.自定义注解切面 (aop拦截器实现)
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.TimeUnit;
/**
* @Desc: 自定义注解拦截器
* @Author: zmk
* @Date: 2022/4/2
*/
@Aspect
@Configuration
public class LockMethodInterceptor {
private final Logger log = LoggerFactory.getLogger(LockMethodInterceptor.class);
private static final Cache CACHES = CacheBuilder.newBuilder()
//最大缓存数
.maximumSize(1000)
//设置过期时间
.expireAfterWrite(3, TimeUnit.SECONDS)
.build();
@Around(value = "@annotation(localLock)")
public Object interceptor (ProceedingJoinPoint point, LocalLock localLock) {
//localLock.key() 这个是获取controller的key属性, point.getArgs()获取key的值
String key = getKey(localLock.key(), point.getArgs());
if (StringUtils.isNotBlank(key)) {
if (CACHES.getIfPresent(key) != null) {
throw new RuntimeException("请勿重复提交");
}
//如果是第一次请求, 将key放入缓存
CACHES.put(key, key);
}
try {
return point.proceed();
} catch (Throwable throwable) {
throw new RuntimeException("服务器异常");
} finally {
//标记为无效
// CACHES.invalidate(key);
}
}
/**
*
* key 生成策略
* @param key key表达式
* @param args 参数
* @return 生成的key
*/
private String getKey(String key, Object[] args) {
for (int i = 0; i < args.length; i++) {
key = key.replace("arg[" + i + "]", args[i].toString());
}
return key;
} 4.定义controller接口
@GetMapping("/query")
@LocalLock(key = "param:arg[0]")
public String query (@RequestParam("abc") String abc) {
return "ok";
}第一次调用结果:

第二次调用结果:

作者最新文章
图几
2026-09-16 17:43
SQL中ROUND函数对0.5的处理机制及强制四舍五入方法
2026-09-15 14:19
JS金额计算怎么避免四舍五入误差
2026-09-14 17:32
韩国8月携号转网数据:Galaxy Z8系列iPhone用户转化率约为Z7系列2倍
2026-09-08 17:02
AE基础教程:如何创建合成并制作关键帧动画
2026-09-04 09:27
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多
Windows 10
Windows
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式
Windows/macOS/Linux
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















