首页 > 其他分享 >表单重复提交解决办法

表单重复提交解决办法

时间:2024-07-17 09:07:14浏览次数:14  
标签:解决办法 REPEAT return String Map request 表单 RepeatSubmit 提交

1.编写RepeatSubmit注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RepeatSubmit{}
2.注册RepeatSubmitInterceptor继承HandlerInterceptorAdapter
public abstract class RepeatSubmitInterceptor extends HandlerInterceptorAdapter {}

3.通过handlerMethod判断方法上是否存在RepeatSubmit,如果有,说明该方法需要验证重复提交
public 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);
}
}

验证表单重复提交方法:
public abstract boolean isRepeatSubmit(HttpServletRequest request) throws Exception;
4.通过request获取方法参数和请求地址
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();

5.从session中获取repeatData缓存数据
HttpSession session = request.getSession();
Object repeatDataSessionObj = session.getAttribute(SESSION_REPEAT_KEY);

6.通过当前的请求地址从repeatData缓存数据获取 上一次请求的 preRequestData
if (repeatDataSessionObj != null)
{
Map<String, Object> sessionMap = (Map<String, Object>) repeatDataSessionObj;
if (sessionMap.containsKey(url))
{
Map<String, Object> preDataMap = (Map<String, Object>) sessionMap.get(url);
if (compareParams(nowDataMap, preDataMap) && compareTime(nowDataMap, preDataMap))
{
return true;
}
}
}
7.判断 上一次的请求系统时间 与 当前请求的系统时间 间隔 是否在 限制 提交范围内。
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;
}

8.比较 preRequestData中的请求参数 与 当前的请求参数是否一致(可以对请求参数进行序列化)
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);
}

9.结合 7和8的判断,做出对应策略,如果重复,返回重复提交提示。不重复则 放行。
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;

标签:解决办法,REPEAT,return,String,Map,request,表单,RepeatSubmit,提交
From: https://www.cnblogs.com/velloLei/p/18306547

相关文章

  • 三分钟了解自定义表单自定义工作流的多个优势
    降本、提高效率、解决信息孤岛是很多企业亟需要解决的问题。什么样的软件平台可以实现这一目标?可以随时来了解低代码技术平台。它当中的自定义表单自定义工作流拥有多个优势特点,可以为企业降低技术门槛、提高工作效率,可视化操作界面的便利性更让职场朋友们深知是实现流程化办公的......
  • vscode 终端高亮的一种解决办法
    vscode终端编译文件,输出信息比较多时,头疼,如果能高亮显示就可以减少头疼想要修改vscode终端输出,网上一堆应该没用的,其实linux自身的终端中就已经支持了这个功能,修改~/.bashrc如下,()win应该也有) 参考VScode终端颜色配置_vscode终端彩色-CSDN博客 //......
  • 《火影忍者:究极风暴4》DX11报错令游戏崩溃怎样处理,火影忍者究极风暴4DX11报错游戏崩溃
    《火影忍者:究极风暴4》DX11报错致使游戏崩溃,这可让玩家们犯了难。究竟该如何解决这个棘手的问题呢?本篇文章将为大家带来火影忍者究极风暴4DX11报错游戏崩溃解决办法,感兴趣的小伙伴们一起来看看吧,希望能够帮助到大家。DX11报错游戏崩溃解决办法1、图形驱动更新:访问NVIDIA、A......
  • 深入探讨React表单组件:从基础到高级
    深入探讨React表单组件:从基础到高级大家好!今天我们来聊聊React中的表单组件。表单在前端开发中是非常常见的需求,无论是登录、注册还是数据提交,表单组件都扮演着重要的角色。本文将带你从基础到高级,深入了解React表单组件的使用和优化。基础知识在React中,表单元素(如<input>、<te......
  • DevExpress WinForms自动表单布局,创建高度可定制用户体验(一)
    使用DevExpressWinForms的表单布局组件可以创建高度可定制的应用程序用户体验,从自动安排UI控件到按比例调整大小,DevExpress布局和数据布局控件都可以让您消除与基于像素表单设计相关的麻烦。P.S:DevExpressWinForms拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务......
  • 电脑提示“Windows 10专业版许可证即将过期”的解决办法
    ​ win10专业版电脑提示:“windows许可证即将过期”的提示,非常烦人,教小白解决办法:使用命令行进行激活:‌1、首先,‌按下“WIN+R”打开运行窗口,‌输入“slmgr.vbs-xpr”按回车,‌查看当前Windows的版本和过期时间。‌  2、接着,‌在电脑左下角开始按钮处右击,‌选择“命令......
  • 集团货币金额与本位币金额不一致的原因及解决办法
    项目场景:在给客户做年结时,我们发现集团货币金额跟公司代码货币金额不一致。问题描述公司启用了集团货币。OB22这里定义了公司代码使用的第二本位币为集团货币(如无必要,不要定义)或者集团货币和公司本位币保持一致:解决方案:需要在定义评估范围时,将集团货币也加到评估范......
  • AE莫名的小问题解决办法和基础的操作快捷键分享
    更多macOS实用教程,小白教学点击这里!AdobeAfterEffects,简称AE,是由Adobe公司开发的视频剪辑和设计软件。它是一款用于动画、视觉效果和电影合成的二维半动画软件,广泛应用于电影、电视和网络视频创作。AfterEffects主要用于创建动态图像和视觉特效,被誉为制作动态影像设计不可或......
  • 填鸭表单!开箱即用的开源问卷调查系统!
    大家好,我是Java陈序员。我们在日常生活中,有时候因为工作需要,需要发布一些问卷调查,来统计数据,获得反馈!今天,给大家介绍一款开箱即用的开源问卷调查系统!关注微信公众号:【Java陈序员】,获取开源项目分享、AI副业分享、超200本经典计算机电子书籍等。项目介绍TDuck——一款免......
  • Win11系统提示找不到LcRes.dll文件的解决办法
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个LcRes.dll文件(挑选合适的版本文件)把它放入......