当前位置: 首页 > news >正文

若依学习——检查当前请求是否为重复提交

isRepeatSubmit 方法用于检查当前请求是否为重复提交。它通过比较当前请求的参数和时间戳与之前存储在 Redis 缓存中的请求信息来判断是否为重复提交。如果是重复提交,则返回 true,否则返回 false。

深入解释

  1. 获取请求参数
String nowParams = "";
if (request instanceof RepeatedlyRequestWrapper) {
    RepeatedlyRequestWrapper repeatedlyRequest = (RepeatedlyRequestWrapper) request;
    nowParams = HttpHelper.getBodyString(repeatedlyRequest);
}

// body参数为空,获取Parameter的数据
if (StringUtils.isEmpty(nowParams)) {
    nowParams = JSON.toJSONString(request.getParameterMap());
}

首先尝试从请求体中获取参数,如果请求体为空,则从请求参数中获取参数,并将其转换为 JSON 字符串。
2. 构建当前请求数据

Map<String, Object> nowDataMap = new HashMap<>();
nowDataMap.put(REPEAT_PARAMS, nowParams);
nowDataMap.put(REPEAT_TIME, System.currentTimeMillis());

将当前请求的参数和时间戳存储在 nowDataMap 中。
3. 构建缓存键

String url = request.getRequestURI();
String submitKey = StringUtils.trimToEmpty(request.getHeader(header));
String cacheRepeatKey = CacheConstants.REPEAT_SUBMIT_KEY + url + submitKey;

使用请求的 URI 和消息头构建一个唯一的缓存键 cacheRepeatKey。
4. 从 Redis 缓存中获取数据

Object sessionObj = redisCache.getCacheObject(cacheRepeatKey);
if (sessionObj != null) {
    Map<String, Object> sessionMap = (Map<String, Object>) sessionObj;
    if (sessionMap.containsKey(url)) {
        Map<String, Object> preDataMap = (Map<String, Object>) sessionMap.get(url);
        if (compareParams(nowDataMap, preDataMap) && compareTime(nowDataMap, preDataMap, annotation.interval())) {
            return true;
        }
    }
}

从 Redis 缓存中获取之前存储的请求数据,并与当前请求数据进行比较。如果参数和时间戳都匹配,则认为是重复提交,返回 true。
5. 存储当前请求数据到 Redis 缓存

Map<String, Object> cacheMap = new HashMap<>();
cacheMap.put(url, nowDataMap);
redisCache.setCacheObject(cacheRepeatKey, cacheMap, annotation.interval(), TimeUnit.MILLISECONDS);

如果不是重复提交,则将当前请求数据存储到 Redis 缓存中,并设置过期时间。
总结
isRepeatSubmit 方法通过比较当前请求的参数和时间戳与之前存储在 Redis 缓存中的请求信息来判断是否为重复提交。如果是重复提交,则返回 true,否则返回 false。

相关文章:

  • AI 智能体的飞船, 很快到下个 Jump Point
  • 微软开源神器OmniParser V2.0 介绍
  • 【MySQL】表的约束(上)
  • Java序列化
  • C++刷题(一):顺序表 + 单链表
  • mne溯源相关说明
  • 威胁驱动的网络安全方法论
  • Vue中涉及的字符串模板与dom模板
  • 约束优化技术:KKT条件的完整推导与应用
  • maven之自定义插件
  • 【清华大学第七版】DeepSeek赋能家庭教育的实操案例(批改作文+辅助语文/数学/科学学习+制定学习计划)
  • 黑盒测试VS白盒测试
  • 30天学习Java第五天——数组 字符串
  • 探索Trae:Cursor的完美替代,Claude-3.5-Sonnet与GPT-4o免费体验
  • SpringBoot3集成RocketMQ阿里巴巴消息队列中间件实现消息发送与接收详细教程
  • 人工智能之数学基础:线性变换的象空间和零空间
  • 富文本编辑器(Rich Text Editor,RTE)
  • 自动化APP测试APPium的元素等待
  • C++:类和对象(从底层编译开始)详解[前篇]
  • 【NVIC】
  • 公司网站建设深圳/网站建设平台有哪些
  • 沈阳怎么做网站/石家庄seo网站排名