中小型项目统一处理请求重复提交 速看

来源:博客园   2023-04-26 22:07:46


【资料图】

请求重复提交的危害

防请求重复提交的方案

前端

后端

这种防请求重复提交的实现有基于Filter的实现,也有基于HandlerInterceptor的实现。最后考量下笔者认为利用RequestBodyAdviceAdapter类来实现代码实现更加简洁,配置更加简单。

在此笔者提供一个注解+RequestBodyAdviceAdapter配合使用的防重复提交的实现。但是这个方案有个小弊端。仅生效于有RequestBody注解的参数,因为使用RequestBodyAdvice来实现。但是大部分我们需要做请求防重复提交的接口一般都是POST请求,且有requestBody。

完整实现在开源项目中:https://github.com/valarchie/AgileBoot-Back-End

实现

声明注解

/** * 自定义注解防止表单重复提交 * 仅生效于有RequestBody注解的参数  因为使用RequestBodyAdvice来实现 * @author valarchie */@Inherited@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Resubmit {    /**     * 间隔时间(s),小于此时间视为重复提交     */    int interval() default 5;}

继承RequestBodyAdviceAdapter实现ResubmitInterceptor

大致的实现是。

/** * 重复提交拦截器 如果涉及前后端加解密的话  也可以通过继承RequestBodyAdvice来实现 * * @author valarchie */@ControllerAdvice(basePackages = "com.agileboot")@Slf4j@RequiredArgsConstructorpublic class ResubmitInterceptor extends RequestBodyAdviceAdapter {    public static final String NO_LOGIN = "Anonymous";    public static final String RESUBMIT_REDIS_KEY = "resubmit:{}:{}:{}";    @NonNull    private RedisUtil redisUtil;    @Override    public boolean supports(MethodParameter methodParameter, Type targetType,        Class> converterType) {        return methodParameter.hasMethodAnnotation(Resubmit.class);    }    /**     * @param body 仅获取有RequestBody注解的参数     */    @NotNull    @Override    public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType,        Class> converterType) {        // 仅获取有RequestBody注解的参数        String currentRequest = JSONUtil.toJsonStr(body);        Resubmit resubmitAnno = parameter.getMethodAnnotation(Resubmit.class);        if (resubmitAnno != null) {            String redisKey = generateResubmitRedisKey(parameter.getMethod());            log.info("请求重复提交拦截,当前key:{}, 当前参数:{}", redisKey, currentRequest);            String preRequest = redisUtil.getCacheObject(redisKey);            if (preRequest != null) {                boolean isSameRequest = Objects.equals(currentRequest, preRequest);                if (isSameRequest) {                    throw new ApiException(ErrorCode.Client.COMMON_REQUEST_RESUBMIT);                }            }            redisUtil.setCacheObject(redisKey, currentRequest, resubmitAnno.interval(), TimeUnit.SECONDS);        }        return body;    }    public String generateResubmitRedisKey(Method method) {        String username;        try {            LoginUser loginUser = AuthenticationUtils.getLoginUser();            username = loginUser.getUsername();        } catch (Exception e) {            username = NO_LOGIN;        }        return StrUtil.format(RESUBMIT_REDIS_KEY,            method.getDeclaringClass().getName(),            method.getName(),            username);    }}

使用

通过在Controller上打上Resubmit注解即可,interval即多久的间隔内相同参数视为重复请求。

/** * 新增通知公告 */@Resubmit(interval = 60)@PostMappingpublic ResponseDTO add(@RequestBody NoticeAddCommand addCommand) {    noticeApplicationService.addNotice(addCommand);    return ResponseDTO.ok();}

这是笔者关于中小型项目防请求重复提交的实现,如有不足欢迎大家评论指正。

全栈技术交流群:1398880

相关新闻

猜你喜欢

中小型项目统一处理请求重复提交 速看

2023-04-26

前沿资讯!新业务新活力,国际航线加速布局,顺丰满足各类细分需求,一季度营收610亿元

2023-04-26

再见拜仁!马内互换交易曝光,1.5亿攻击手有望加盟-环球看点

2023-04-26

五号特工组第三部14集 五号特工组第三部1_世界热文

2023-04-26

营收超31亿,净利润超10亿,汤臣倍健创单季业绩历史新高

2023-04-26

周口水上公安全力护航第九届全省民族运动会龙舟赛 世界视讯

2023-04-26

重庆有哪些三本医学院校录取分数线

2023-04-26

小学2019年寒假放假时间_2019年小学放寒假时间

2023-04-26

营口市站前区领导干部进企业 凝聚服务振兴发展“硬核力量” 当前看点

2023-04-26

环球看点!昆仑万维(300418.SZ):预计今年内将发布中国版类ChatGPT

2023-04-26

阿里云宣布史上最大规模降价 核心产品价格全线下调15%~50%-每日视点

2023-04-26

古诗配画图片大全简单模板_古诗配画图片大全简单 天天即时看

2023-04-26

高龄能不能转行做程序员?

2023-04-26

【当前独家】CBA一日三消息,NBA三双王加入中国队,浙江憾折一人,首钢摊牌!

2023-04-26

全球看热讯:5盎司熊猫银币回收价格(2023年04月26日)

2023-04-26

凯旺科技董秘回复:感谢您长期的关注和支持,您所提出的问题,也正是我们凯旺所有管理层最关心的问题

2023-04-26

美国“千禧一代”深陷债务困境_全球速看料

2023-04-26

【世界新要闻】北宋都城的繁荣景象_北宋都城

2023-04-26

当前报道:多多视频点的赞从哪里找(多多视频给好友点的赞从哪里找)

2023-04-26

海正生材2023年一季度实现净利润416万元

2023-04-26

全球今热点:英雄联盟手游全球冠军杯_关于英雄联盟手游全球冠军杯的简介

2023-04-26

漯河龙舟公开赛,精彩水上盛宴启幕进入倒计时

2023-04-26

海通国际:给予万润股份增持评级,目标价位23.52元

2023-04-26

即时看!五一假期5天高速免费通行,首日预计有550万辆车上高速

2023-04-26

每日热文:总价超58亿!3GW海陆风电项目开标 6家整机商分羹

2023-04-26

精彩图集