AOP防止表单重复提交

实现原理

  • 基于HttpServletRequest获取服务端session
  • 基于HttpServletRequest获取请求路径url
  • 基于HttpServletRequest获取请求参数
  • java类适配实现自定义方法重写
  • 通过检验url和对应的参数判断是否是同一次表单提交

自定义注解

@Inherited
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RepeatSubmit
{
}

防止重复提交拦截器

/*** 防止重复提交拦截器*/
@Component
public abstract class RepeatSubmitInterceptor extends HandlerInterceptorAdapter
{@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{if (handler instanceof HandlerMethod){HandlerMethod handlerMethod = (HandlerMethod) handler;Method method = handlerMethod.getMethod();RepeatSubmit annotation = method.getAnnotation(RepeatSubmit.class);if (annotation != null){if (this.isRepeatSubmit(request)){AjaxResult ajaxResult = AjaxResult.error("不允许重复提交,请稍后再试");ServletUtils.renderString(response, JSON.marshal(ajaxResult));return false;}}return true;}else{return super.preHandle(request, response, handler);}}/*** 验证是否重复提交由子类实现具体的防重复提交的规则* * @param httpServletRequest* @return* @throws Exception*/public abstract boolean isRepeatSubmit(HttpServletRequest request) throws Exception;
}

防止重复提交拦截器方法重写

package com.ruoyi.framework.interceptor.impl;import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Component;
import com.ruoyi.common.json.JSON;
import com.ruoyi.framework.interceptor.RepeatSubmitInterceptor;/*** 判断请求url和数据是否和上一次相同, * 如果和上次相同,则是重复提交表单。 有效时间为10秒内。*/
@Component
public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
{public final String REPEAT_PARAMS = "repeatParams";public final String REPEAT_TIME = "repeatTime";public final String SESSION_REPEAT_KEY = "repeatData";/*** 间隔时间,单位:秒 默认10秒* * 两次相同参数的请求,如果间隔时间大于该参数,系统不会认定为重复提交的数据*/private int intervalTime = 10;public void setIntervalTime(int intervalTime){this.intervalTime = intervalTime;}@SuppressWarnings("unchecked")@Overridepublic boolean isRepeatSubmit(HttpServletRequest request) throws Exception{// 本次参数及系统时间String nowParams = JSON.marshal(request.getParameterMap());Map<String, Object> nowDataMap = new HashMap<String, Object>();nowDataMap.put(REPEAT_PARAMS, nowParams);nowDataMap.put(REPEAT_TIME, System.currentTimeMillis());// 请求地址(作为存放session的key值)String url = request.getRequestURI();HttpSession session = request.getSession();Object sessionObj = session.getAttribute(SESSION_REPEAT_KEY);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)){return true;}}}Map<String, Object> sessionMap = new HashMap<String, Object>();sessionMap.put(url, nowDataMap);session.setAttribute(SESSION_REPEAT_KEY, sessionMap);return false;}/*** 判断参数是否相同*/private boolean compareParams(Map<String, Object> nowMap, Map<String, Object> preMap){String nowParams = (String) nowMap.get(REPEAT_PARAMS);String preParams = (String) preMap.get(REPEAT_PARAMS);return nowParams.equals(preParams);}/*** 判断两次间隔时间*/private boolean compareTime(Map<String, Object> nowMap, Map<String, Object> preMap){long time1 = (Long) nowMap.get(REPEAT_TIME);long time2 = (Long) preMap.get(REPEAT_TIME);if ((time1 - time2) < (this.intervalTime * 1000)){return true;}return false;}
}

AOP防止表单重复提交相关推荐

  1. springboot 订单重复提交_Spring Boot (一) 校验表单重复提交

    一.前言 在某些情况下,由于网速慢,用户操作有误(连续点击两下提交按钮),页面卡顿等原因,可能会出现表单数据重复提交造成数据库保存多条重复数据. 存在如上问题可以交给前端解决,判断多长时间内不能再次点 ...

  2. 简单介绍redis分布式锁解决表单重复提交的问题

    在系统中,有些接口如果重复提交,可能会造成脏数据或者其他的严重的问题,所以我们一般会对与数据库有交互的接口进行重复处理.本文就详细的介绍一下redis分布式锁解决表单重复提交,感兴趣的可以了解一下 假 ...

  3. 【精品】防止表单重复提交 方法汇总

    背景 表单重复提交会造成数据重复,增加服务器负载,严重甚至会造成服务器宕机等情况,有效防止表单重复提交有一定的必要性. 常见的防止表单重复提交解决方案有以下几种: 一.通过一个标识来控制表单提交之后, ...

  4. 如何防止表单重复提交(后端)

    1.背景与介绍: 平时开发的项目中可能会出现下面这些情况: 由于用户误操作,多次点击表单提交按钮. 由于网速等原因造成页面卡顿,用户重复刷新提交页面. 黑客或恶意用户使用postman等工具重复恶意提 ...

  5. 防止表单重复提交方法

    1.背景与介绍: 平时开发的项目中可能会出现下面这些情况: 由于用户误操作,多次点击表单提交按钮. 由于网速等原因造成页面卡顿,用户重复刷新提交页面. 黑客或恶意用户使用postman等工具重复恶意提 ...

  6. springboot 订单重复提交_防止表单重复提交(springboot,redis)

    我们在web项目中经常需要在后台对用户提交的表单进行校验防止重复提交.下面通过springboot的aop.redis来解决表单重复提交的问题. 通过在controller加上CheckSubmitF ...

  7. spring boot 学习(七)小工具篇:表单重复提交

    注解 + 拦截器:解决表单重复提交 前言 学习 Spring Boot 中,我想将我在项目中添加几个我在 SpringMVC 框架中常用的工具类(主要都是涉及到 Spring AOP 部分知识).比如 ...

  8. redis防表单重复提交

    参考链接: 防表单重复提交的四种方法:https://www.cnblogs.com/huanghuizhou/p/9153837.html 补充几点个人想法: 1. 对于前后端传递token验证的方 ...

  9. 后台防止表单重复提交

    方案一:利用Session防止表单重复提交 具体的做法: 1.获取用户填写用户名和密码的页面时向后台发送一次请求,这时后台会生成唯一的随机标识号,专业术语称为Token(令牌). 2.将Token发送 ...

最新文章

  1. hdu 2881(简单dp)
  2. 二、MyBatis常用对象分析 封装工具类
  3. c语言100000阶乘,求10000的阶乘(c语言代码实现)
  4. BootStrap笔记-文本颜色链接颜色背景颜色
  5. (转)关于数据库存储过程分页DatagridView BindingNavigator 控件的详细实现
  6. js获取对象数组中指定属性值对象_3分钟学会操作JavaScript内置对象,快来试试吧...
  7. Android提高篇内容整理
  8. poj 1815(最小割、割集)
  9. mysql不等于多个数怎么写_mysql不等于符号怎么写
  10. python绘制多边形的程序_Python – 绘制多边形
  11. (十二)采购与入库数据表
  12. ansible防火墙firewalld设置
  13. 刷表法 和 填表法(DP)
  14. 数据结构程序设计——山东省城际铁路建设建设
  15. 3d打印光固化好还是热固化好_光固化3D打印机的优势在哪里?
  16. html5手机号码数据类型,报手机号码的四种格式,你是哪种性格?
  17. java判断标签闭合_html转PDF(java)非常奇怪的错误,标签没闭合
  18. 拉格朗日插值公式---读题题
  19. 输入矩形的长和宽。计算其面积和周长
  20. vue使用socktJs

热门文章

  1. Number Game(数字游戏)
  2. Cesium 修改geojson样式
  3. 超市收银系统c语言程序用c 的,C语言 超市收银系统
  4. [SAS - TEMPLATE] ODS输出格式的定义一些小总结
  5. 什么叫资讯,资讯是什么?
  6. 在Excel中用VB批量生成二维码
  7. Android:访问存储失败.FileNotFoundException open failed: XXXXXXX EPERM (Operation not permitted)
  8. MindSpore数据集加载-GeneratorDataset数据处理报错:The pointer[cnode] is null
  9. oracle 中处理标准差的问题
  10. linux(07)之内核系统调用