返回顶部
首页 > 资讯 > 后端开发 > Python >springboot幂等切片的实现
  • 701
分享到

springboot幂等切片的实现

2024-04-02 19:04:59 701人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录一、前言二、示例一、前言 最近测试提某些接口重复提交的问题,想了下应该不止是前端点击之后按钮不可点击的问题,后端应该根据登录token、操作方法、参数做多层的判断。 二、示例 切

一、前言

最近测试提某些接口重复提交的问题,想了下应该不止是前端点击之后按钮不可点击的问题,后端应该根据登录token、操作方法、参数做多层的判断。

二、示例

切片代码


@Slf4j
@Aspect
@Component
public class apiIdempotentAspect {

    @Resource
    RedisUtil redisUtil;
    @Resource
    UserUtils userUtils;


    @Pointcut("@annotation(com.xx.anno.ApiIdempotent)")
    private void pointCut() {
    }

    @Before("pointCut()")
    public void doPoint(JoinPoint joinPoint) {
        String action = joinPoint.getSignature().getDeclaringTypeName()
                .substring(joinPoint.getSignature().getDeclaringTypeName().lastIndexOf(".")+1)
                + "::" + joinPoint.getSignature().getName();
        String args = JSON.tojsONString(joinPoint.getArgs());
        String token = userUtils.getAuthToke().replace("-","")
                .replace("Bearer ","");
        String idempotenTKEy = "api::idempotent::"+token+"::"+action;
        //短时间内没进行相似操作
        if(redisUtil.hasKey(idempotentKey)){
            //接口参数是否一致
            String idempotentValue = redisUtil.getCacheObject(idempotentKey);
            log.info("idempotentValue : {}",idempotentValue);
            if(args.equals(idempotentValue)){
                throw new BusinessException("请勿重复操作");
            }
        } else{
            //30s内禁止重复操作
            redisUtil.setCacheObject(idempotentKey,args,30, TimeUnit.SECONDS);
        }

    }

}

用到一个redisutil

@Component
public class RedisUtil {

    @Resource
    public RedisTemplate redisTemplate;

    
    public <T> void setCacheObject(final String key, final T value)
    {
        redisTemplate.opsForValue().set(key, value);
    }

    
    public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit)
    {
        redisTemplate.opsForValue().set(key, value, timeout, timeUnit);
    }

    
    public boolean expire(final String key, final long timeout)
    {
        return expire(key, timeout, TimeUnit.SECONDS);
    }

    
    public boolean expire(final String key, final long timeout, final TimeUnit unit)
    {
        return redisTemplate.expire(key, timeout, unit);
    }

    
    public <T> T getCacheObject(final String key)
    {
        ValueOperations<String, T> operation = redisTemplate.opsForValue();
        return operation.get(key);
    }

    
    public boolean deleteObject(final String key)
    {
        return redisTemplate.delete(key);
    }

    
    public long deleteObject(final Collection collection)
    {
        return redisTemplate.delete(collection);
    }

    
    public <T> long setCacheList(final String key, final List<T> dataList)
    {
        Long count = redisTemplate.opsForList().rightPushAll(key, dataList);
        return count == null ? 0 : count;
    }

    
    public <T> List<T> getCacheList(final String key)
    {
        return redisTemplate.opsForList().range(key, 0, -1);
    }

    
    public <T> BoundSetOperations<String, T> setCacheSet(final String key, final Set<T> dataSet)
    {
        BoundSetOperations<String, T> setOperation = redisTemplate.boundSetOps(key);
        Iterator<T> it = dataSet.iterator();
        while (it.hasNext())
        {
            setOperation.add(it.next());
        }
        return setOperation;
    }

    
    public <T> Set<T> getCacheSet(final String key)
    {
        return redisTemplate.opsForSet().members(key);
    }

    
    public <T> void setCacheMap(final String key, final Map<String, T> dataMap)
    {
        if (dataMap != null) {
            redisTemplate.opsForHash().putAll(key, dataMap);
        }
    }

    
    public <T> Map<String, T> getCacheMap(final String key)
    {
        return redisTemplate.opsForHash().entries(key);
    }

    
    public <T> void setCacheMapValue(final String key, final String hKey, final T value)
    {
        redisTemplate.opsForHash().put(key, hKey, value);
    }

    
    public <T> T getCacheMapValue(final String key, final String hKey)
    {
        HashOperations<String, String, T> opsForHash = redisTemplate.opsForHash();
        return opsForHash.get(key, hKey);
    }

    
    public <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys)
    {
        return redisTemplate.opsForHash().multiGet(key, hKeys);
    }

    
    public Collection<String> keys(final String pattern)
    {
        return redisTemplate.keys(pattern);
    }

    
    public boolean hasKey(final String key){
        return redisTemplate.hasKey(key);
    }
}

到此这篇关于SpringBoot幂等切片的实现的文章就介绍到这了,更多相关springboot幂等切片内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: springboot幂等切片的实现

本文链接: https://lsjlt.com/news/140924.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • springboot幂等切片的实现
    目录一、前言二、示例一、前言 最近测试提某些接口重复提交的问题,想了下应该不止是前端点击之后按钮不可点击的问题,后端应该根据登录token、操作方法、参数做多层的判断。 二、示例 切...
    99+
    2024-04-02
  • springboot幂等切片怎么实现
    本篇内容介绍了“springboot幂等切片怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、前言最近测试提某些接口重复提交的问题,...
    99+
    2023-06-29
  • Springboot利用Redis实现接口幂等性拦截
    目录前言正文实战开始核心三件套工具类三件套REDIS配置类前言 近期一个老项目出现了接口幂等性 校验问题,前端加了按钮置灰, 依然被人拉着接口参数一顿输出,还是重复调用了接口,小陈及...
    99+
    2024-04-02
  • redis怎么实现幂等
    在Redis中实现幂等性可以通过以下几种方式:1. 使用Redis的原子操作:Redis支持一些原子操作,如SETNX(设置键值对,...
    99+
    2023-09-11
    redis
  • SpringBoot实现接口等幂次校验的示例代码
    目录主流的实现方案如下:第一步:书写redis工具类第二步、书写token工具类第三步:定义注解,使用在方法上,当控制层的方法上被注释时,表示该请求为等幂性请求第四步:拦截器配置。选...
    99+
    2024-04-02
  • SpringBoot结合Redis实现接口幂等性的示例代码
    目录介绍实现过程引入 maven 依赖spring 配置文件写入引入 Redis自定义注解token 的创建和实现拦截器的配置测试用例介绍 幂等性的概念是,任意多次执行所产生的影响都...
    99+
    2024-04-02
  • 使用SpringBoot实现接口幂等性的方法有哪些
    使用SpringBoot实现接口幂等性的方法有哪些?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、什么是幂等性幂等是一个数学与计算机学概念,在数学中某一元运算为幂等时,其...
    99+
    2023-06-07
  • Springboot怎么利用Redis实现接口幂等性拦截
    今天小编给大家分享一下Springboot怎么利用Redis实现接口幂等性拦截的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。...
    99+
    2023-07-02
  • Spring Boot怎么实现接口自动幂等
    今天小编给大家分享一下Spring Boot怎么实现接口自动幂等的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我...
    99+
    2024-04-02
  • SpringBoot处理接口幂等性的两种方法详解
    目录1. 接口幂等性实现方案梳理1.1 基于 Token1.2 基于请求参数校验2. 基于请求参数的校验在上周发布的 TienChin 项目视频中,我和大家一共梳理了六种幂等性解决方...
    99+
    2024-04-02
  • 结构体切片!=它实现的接口切片?
    php小编苹果在这里为大家揭开一个有关结构体切片的谜题:结构体切片与它实现的接口切片之间的差别是什么?在Go语言中,切片是一种方便且灵活的数据结构,可以动态改变大小。而结构体切片则是切...
    99+
    2024-02-09
    go语言 overflow
  • SpringBoot + FFmpeg实现一个简单的M3U8切片转码系统
    目录想法实现工程pom配置文件TranscodeConfig,用于控制转码的一些参数MediaInfo,封装视频的一些基础信息FFmpegUtils,工具类封装FFmpeg的一些操作...
    99+
    2024-04-02
  • pythoniloc和loc切片的实现
    目录一、含正负号的下标二、loc和iloc1. 利用loc、iloc提取行数据2. 利用loc、iloc提取列数据3.利用loc、iloc提取指定行、指定列数据4.利用loc、ilo...
    99+
    2024-04-02
  • python切割图片的实现示例
    用opencv处理一下pillow也可以,但是试过有时候会把图片自动旋转180°,cv没有这个问题 import os from cv2 import cv2 def s...
    99+
    2024-04-02
  • javascript实现图片切换的方法
    小编给大家分享一下javascript实现图片切换的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!javascript实现图片切换的方法:首先新建文件,使用i...
    99+
    2023-06-14
  • SpringBoot实现多数据源的切换实践
    目录前言工程结构编码实现yml文件主数据源MainDatasourceProperties其他数据源DynamicDatasourceProperties数据源配置类Datasour...
    99+
    2024-04-02
  • springboot怎么实现对注解的切面
    本篇内容介绍了“springboot怎么实现对注解的切面”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!对注解实现切面案例:(1)定义一个注解...
    99+
    2023-06-22
  • springboot实现基于aop的切面日志
    本文实例为大家分享了springboot实现基于aop的切面日志的具体代码,供大家参考,具体内容如下 通过aop的切面方式实现日志 通切面拦截所有指定包下的所有方法 @Aspect ...
    99+
    2024-04-02
  • springboot实现对注解的切面案例
    对注解实现切面案例: (1)定义一个注解 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public...
    99+
    2024-04-02
  • html5如何实现碎片式图片切换
    这篇文章主要为大家展示了“html5如何实现碎片式图片切换”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“html5如何实现碎片式图片切换”这篇文章吧。准备工作1...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作