首页 > 其他分享 >防重复提交解决方案

防重复提交解决方案

时间:2024-11-14 17:21:42浏览次数:1  
标签:提交 String 重复 解决方案 request expire key import annotation

基于springboot切面

package com.minex.handler.aop;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD) // 可以标记在方法上
@Retention(RetentionPolicy.RUNTIME) // 在运行时通过反射来读取
public @interface NoRepeatSubmit {
    // 可以设置一些参数,例如过期时间等,这里简化处理
    String keyPrefix() default "v3:NoRepeatSubmit:";
    int expire() default 2; // 默认为2秒
}

 

package com.minex.handler.aop;

import cn.hutool.core.util.StrUtil;
import com.minex.common.exception.ExceptionFactory;
import com.minex.manager.RemoteCacheManager;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Objects;
import java.util.concurrent.TimeUnit;

@Aspect
@Component
public class NoRepeatSubmitAspect {

    @Resource
    private RemoteCacheManager remoteCacheManager;

    @Resource
    public RedisTemplate redisTemplate;

    @Around("@annotation(noRepeatSubmit)")
    public Object around(ProceedingJoinPoint point, NoRepeatSubmit noRepeatSubmit) throws Throwable {
        return handleCheck(point, noRepeatSubmit);
    }

    private Object handleCheck(ProceedingJoinPoint point, NoRepeatSubmit noRepeatSubmit) throws Throwable {
        String keyPrefix = noRepeatSubmit.keyPrefix();
        Integer expire = noRepeatSubmit.expire();
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        // 构建key,可以根据实际情况设计,这里简单使用请求URL和请求方法作为key
        String key = buildKey(keyPrefix, request);
        // 检查Redis中是否存在该key
        boolean exists = redisTemplate.hasKey(key);
        if (!exists) {
            remoteCacheManager.setCacheObject(key, "1", expire, TimeUnit.SECONDS);
            // 如果key不存在,则认为是有效请求,继续执行
            return point.proceed();
        } else {
            // 如果key已存在,则认为是重复请求 并且刷新过期时间
            remoteCacheManager.expire(key, expire, TimeUnit.SECONDS);
            throw ExceptionFactory.bizException("请勿重复提交," + expire + "秒内不能重复提交");
        }
    }

    private String buildKey(String prefix, HttpServletRequest request) {
        // 根据实际情况构建key,这里以请求的URL和HTTP方法为基础
        String uri = request.getRequestURI();
        String method = request.getMethod();
        String token = request.getHeader("authorization");
        if (StrUtil.isNotEmpty(token)) {
            return prefix + ":" + uri + ":" + method + ":" + token;
        } else {
            return prefix + ":" + uri + ":" + method;
        }
    }
}

 

使用示例

 

标签:提交,String,重复,解决方案,request,expire,key,import,annotation
From: https://www.cnblogs.com/guanxiaohe/p/18546436

相关文章

  • 作业提交课程考试系统springboot-java毕设源码论文
        博主介绍:......
  • 通用零部件制造行业MES系统解决方案
    在现代制造业中,MES系统成为提升工厂生产效率和质量管理的关键工具。通用零部件制造行业由于其产品种类繁多、批量小、定制化需求高等特点,对MES系统的需求尤为迫切。本文将介绍MES系统在通用零部件制造行业中的应用方法和价值,并结合具体的应用场景进行说明。一、MES系统是什么......
  • 萤石设备视频接入平台EasyCVR大华设备视频平台果园综合安防解决方案
    在现代农业发展中,果园作为农业生产的重要组成部分,其安全防护和管理效率的提升显得尤为重要。随着科技的进步,传统的果园管理方式已经无法满足现代高效、智能化的需求。特别是在偏远地区,果园面临着非法入侵、夜间安全监控以及供电和网络布线等一系列挑战。为了应对这些挑战,萤石设备......
  • vue项目部署后刷新页面404的原因和解决方案
     一、这是为什么,我们先来了解下vue路由两种模式的区别。newRouter({mode:'hash',//historyroutes:[],...})1.hash模式(默认)的访问URL中有#字符,history模式的URL没有带#,外观上history模式比hash模式好看些;2.hash模式通过监听浏览器的onhashchange()......
  • 【Unity第一人称射击游戏 (FPS) 动画框架】FPS Animation Framework ,提供了 武器动画
    FPSAnimationFramework是一款为Unity提供的专门用于第一人称射击游戏(FPS)的动画框架插件。它旨在帮助开发者快速实现FPS游戏中的角色控制、武器操作、动作与动画等核心功能。通过该框架,开发者可以轻松创建高质量、流畅的动画效果,提高玩家的沉浸感与游戏的打击感......
  • Rust 在 Android 的编程实践——技术驱动的车云一体化解决方案探索
    Greptime车云一体化解决方案颠覆了从前传统的车云协同模式,采用更加低成本、高效率的方案来满足当前的市场需求。其中GreptimeDBEdge作为核心组件,专为车机环境量身打造。本文旨在详尽探讨在Android平台利用Rust语言进行开发过程中所积累的经验和教训。交叉编译在车机场景......
  • 项目解决方案:多地宠物店的视频监控系统建设解决方案
    目录一.项目背景1.1背景描述1.2需求分析二.设计依据和建设目标2.1设计依据2.2建设目标三.系统设计实现3.1系统方案设计​3.2组网说明四.产品介绍4.1概述4.2设备接入4.2.1内部设备接入4.2.2外部设备接入4.2.3级联上级平台4.3视频资源管理4.4用户权限管理4.5视......
  • CATIA许可证无法获取的解决方案
    在使用CATIA软件时,偶尔会遇到许可证无法获取的问题,这不仅影响工作效率,还可能打断设计流程。别担心,本文将为您提供一系列实用的解决方案,助您迅速恢复CATIA软件的正常使用。一、检查网络连接首先,请确保您的计算机已连接到互联网,并且网络连接稳定。CATIA许可证的获取通常需要与许可......
  • 汽车场景OCR解决方案:电子行驶证与驾驶证识别,引领智慧交通新纪元
    在数字化浪潮的推动下,交通管理行业迎来了革命性的变化。OCR技术的电子行驶证和电子驾驶证的引入,极大地提高了车辆和驾驶执照的管理效率,并为车主的出行带来了极大的便利。随着电子证件的普及,交通管理正逐步从传统的实体证件向数字化转型,这不仅为智能出行提供了便利,也催生了新的......
  • DApp开发:定制化解决方案与源码部署的一站式指南
    去中心化应用(DApp)随着区块链技术的发展,成为众多行业探索与创新的重要方向。无论是金融、供应链、游戏,还是社交和艺术市场,DApp都为传统业务模式带来了全新可能。然而,开发一款DApp并非易事,从合约设计到前后端的搭建,再到部署与安全性考虑,整个过程涉及多项技术和策略。在这里,我们将......