赞
踩
上次使用了Spring Aop + 自定义注解实现了Redis防止重复提交的操作,这次换一种方式,防止重复提交的逻辑是相同的,还是采用 用户token + 接口url 进行唯一表示注解实现防止重复提交(Aop)_crazyK.的博客-CSDN博客
首先创建一个防止重复提交的注解
- @Documented
- @Target({ElementType.TYPE,ElementType.METHOD})
- @Retention(RetentionPolicy.RUNTIME)
- public @interface NoRepeatSubmit2 {
- int lockTime() default 5;
- }
注解参数不懂的小伙伴可以移步这篇文章:java自定义注解_crazyK.的博客-CSDN博客
这里主要是继承 HandlerInterceptorAdapter 重写它的 preHandle 方法,通过反射在方法和类上寻找注解,然后进行防止重复提交的逻辑
- @Component
- public class SubmitInterceptor extends HandlerInterceptorAdapter {
-
- @Autowired
- private RedisTemplate<String,Object> redisTemplate;
-
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
- Object handler)throws Exception{
- HandlerMethod handlerMethod = (HandlerMethod) handler;
-
- //通过反射在方法上寻找注解
- NoRepeatSubmit2 permission = handlerMethod.getMethodAnnotation(NoRepeatSubmit2.class);
- if (permission == null){
- //方法不存在则在类上寻找注解
- permission = handlerMethod.getBeanType().getAnnotation(NoRepeatSubmit2.class);
- }
- if (permission == null){
- //没有注解直接跳过拦截
- return true;
- }
- int time = permission.lockTime();
- HttpServletRequest httpServletRequest = HttpContextUtils.httpServletRequest();
- String token = request.getHeader("token");
- String url = request.getRequestURL().toString();
- String sign = url+"/"+token;
- Boolean key=redisTemplate.hasKey(sign);
- if (key){
- throw new Exception("请勿重复提交");
- }
- redisTemplate.opsForValue().set(sign,sign,time, TimeUnit.SECONDS);
- return true;
- }
- }
- @Configuration
- public class WebMvcConfig implements WebMvcConfigurer {
-
- @Autowired
- private SubmitInterceptor submitInterceptor;
-
- @Override
- public void addInterceptors(InterceptorRegistry registry){
- registry.addInterceptor(submitInterceptor).addPathPatterns("/**");
- }
-
-
- }
最后在方法上加上此注解
首先向 redis 中插入 一条 key为crazyk,value为csdn的数据
redis中也写入了
然后再提交一次
进入后端查看,系统抛出我们自己定义的异常
代码已同步至Gitee:RedisBoot: springboot集成redis
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。