• 顺手写的一个防重复提交


    注解定义

    package com.xf.common;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    /**
     * @author Administrator 顺手写的一个防重复提交注解
     */
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface ReSubmit {
        // 执行时间
        int delaySeconds() default 50;
    }

    拦截器实现

    package com.xf.config;
    
    import java.lang.reflect.Method;
    import java.util.concurrent.TimeUnit;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.stereotype.Component;
    import org.springframework.web.method.HandlerMethod;
    import org.springframework.web.servlet.HandlerInterceptor;
    
    import com.xf.common.BizException;
    import com.xf.common.ErrorCode;
    import com.xf.common.ReSubmit;
    
    import cn.hutool.core.lang.Console;
    import cn.hutool.extra.spring.SpringUtil;
    
    /**
     * @author ckw
     * @version 1.0
     * @date 2020/6/11 10:11
     * @description: 拦截重复提交数据
     */
    @Component
    public class ReSubmitInterceptor implements HandlerInterceptor {
    
    //    @Autowired
        RedisTemplate redisTemplate;
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
                throws Exception {
    //        redisTemplate.delete(getKey(request));
            HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
        }
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                throws Exception {
            if (!(handler instanceof HandlerMethod))
                return true;
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            Method method = handlerMethod.getMethod();
            // 拿到方法上面的自定义注解
            ReSubmit annotation = method.getAnnotation(ReSubmit.class);
            // 如果不等于null说明该方法要进行幂等
            if (null != annotation) {
                redisTemplate = SpringUtil.getBean(RedisTemplate.class);
                redisTemplate.opsForValue().set("aa", "aa");
                boolean succ = redisTemplate.opsForValue().setIfAbsent(getKey(request), 0, annotation.delaySeconds(),
                        TimeUnit.SECONDS);
                if (!succ)
                    throw new BizException(ErrorCode.ReSubmit);
            }
            return true;
        }
    
        String getKey(HttpServletRequest request) {
    //        String token = request.getHeader("token");
            String token = "";
            String url = request.getServletPath();
            Console.log(token + url);
            return token + url;
        }
    }

    有追求,才有动力!

    向每一个软件工程师致敬!

    by wujf

    mail:921252375@qq.com

  • 相关阅读:
    张艾迪(创始人):视觉计算极简主义的设计
    张艾迪(创始人):同一个世界.同一个梦想
    张艾迪(创始人):Hello.世界...
    张艾迪(创始人):理念是全世界都在用....
    张艾迪(创始人):解码互联网天才
    张艾迪(创始人):艾迪成长记
    张艾迪(创始人): 趣味励志
    张艾迪(创始人): 励志的路上
    张艾迪(创始人):创始人故事无限N个
    张艾迪(创始人): 从诞生那一刻.走向整个世界
  • 原文地址:https://www.cnblogs.com/wujf/p/15307401.html
Copyright © 2020-2023  润新知