您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

Java如何限制前端重复请求

2025/4/29 3:14:34发布16次查看
背景及用途前端页面出现卡顿,用户反复点击操作按钮,导致后台接口短时间内多次提交
实现步骤设置切面,增加注解,导致在规定时间内该接口不可重复调用
设置一个接口 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包
<dependency> <groupid>com.google.guava</groupid> <artifactid>guava</artifactid> <version>31.1-jre</version> </dependency>
2.自定义本地锁
package com.hzt.listener;import java.lang.annotation.*;/** * 自定义-控制重复提交锁 */@target(elementtype.method) //作用于方法@retention(retentionpolicy.runtime) //运行时有效@documented@inheritedpublic @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@configurationpublic class lockmethodinterceptor { private final logger log = loggerfactory.getlogger(lockmethodinterceptor.class); private static final cache<string, object> 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"; }
第一次调用结果:
第二次调用结果:
以上就是java如何限制前端重复请求的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product