顺手写的一个防重复提交

注解定义

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

原文地址:https://www.cnblogs.com/wujf/p/15307401.html