实现步骤设置切面,增加注解,导致在规定时间内该接口不可重复调用
设置一个接口 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如何限制前端重复请求的详细内容。