重复提交的定义:
重复提交指的是同一个请求(请求地址和请求参数都相同)在很短的时间内多次提交至服务器,从而对服务器造成不必要的资源浪费,甚至在代码不健壮的情况还会导致程序出错。
重复提交的原因或触发事件:
【场景一】一次请求处理过慢,用户等不及点了多次提交按钮。【场景二】提交请求之后,用户又多次点了刷新按钮或者点了回退【场景三】同时打开了多个窗口提交数据。
重复提交的解决方案:
对于【场景一】
可以通过JS在用户点击按钮之后立即disable按钮,让他不能点。
如果是ajax提交的方式,那可以出现一个遮罩层。在服务器响应之前不让用户在做操作。
如果使用Jquery的$.ajax方法提交,可以将async设置成false,或者在beforeSend方法中开启遮罩层。
对于【场景二】和【场景三】
简单的解决方案是:将表单提交方式改成ajax提交,然后按上面的方式控制用户只能点一次提交按钮。而且ajax方式用户也不能回退和刷新。
对于【场景三】则需要一种稍复杂的方案就是令牌(Token),下面就来详细介绍令牌方案
令牌(Token)解决方案
方案步骤
1. 开发自定义注解来区分哪些请求方法是需要控制重复提交的。
1@Target(ElementType.METHOD) 2@Retention(RetentionPolicy.RUNTIME) 3public @interface Token { 4/** 5 *
保存并更新token,请在需要生成token的方法上设置save=true,例如:页面跳转的方法
6 *@since 2019年4月4日 7*/ 8boolean save()defaultfalse; 9/** 10 *
校验token,请在提交的方法上加上本属性
11 *@since 2019年4月4日12*/ 13boolean check()defaultfalse; 14 }
2. 使用过滤器或拦截器,配合上文的注解生成令牌和校验令牌。
本文使用得是Spring拦截器,Spring配置文件:
1