面试经历
记得刚结业的时间,有一次去参加面试。
上来面试官问我:“你们项目中是怎么做防重复提交的?”
一开始听到这个题目是蒙圈的,支支吾吾半天没答复出来。
然背面试官直接来一道算法题,喜闻乐见解面试失败。
多年过去,固然很少接触到控台应用,但是近期对于防止重复提交却有了一点本身的心得。
在这里分享给大家,盼望你工作大概面试中遇到雷同的题目时,对你有所帮助。
本文将从以下几个方面展开:
(1)重复提交产生的原因
(2)什么是幂等性
(3)针对重复提交,前后端的办理方案
(4)如果实现一个防重复提交工具
产生原因
由于重复点击大概网络重发
eg:
点击提交按钮两次;
点击革新按钮;
使用浏览器后退按钮重复之前的操作,导致重复提交表单;
使用浏览器汗青纪录重复提交表单;
浏览器重复的HTTP请求;
nginx重发等情况;
分布式RPC的try重发等;
主要有 2 个部门:
(1)前端用户操作
(2)网络请求可能存在重试
当然也不排除一些用户的恶意操作。
java 表单避免重复提交
题目
就是同一份信息,重复的提交给服务器。
场景
- 点击F5革新页面: 当用户点击submit将已经写好的表单数据提交到服务器时,可以在浏览器的url看到地址和参数的变化,但因为网速等题目,用户当前页面并未革新,大概点击革新页面,造成表单重复提交。
- 重复点击提交按钮: 因为网络题目,未能及时跳转显示内容,部门用户可能会出于心急重复提交提交按钮,造成多次提交内容到服务器。
- 前进后退操作 :有些用户在进行某些工作操作时,可能出于必要大概某种情况,进行后退操作,浏览刚才填入的信息,在进行后退和前进的操作可能也会造成表单数据重复提交到服务器。
- 使用浏览器汗青纪录重复访问: 某些用户可能会出于好奇,使用浏览器的汗青纪录功能重复访问提交页面,同样会造成表单重复提交题目。
办理思路
前端
方案一:禁用按钮提交
设置标志位,提交之后克制按钮。像一些短信验证码的按钮一般都会加一个前端的按钮禁用,毕竟发短信是必要钞票滴~
ps: 以前写前端就用过这种方式。
简单。基本可以防止重复点击提交按钮造成的重复提交题目。
前进后退操作,大概F5革新页面等题目并不能得到办理。
最告急的一点,前端的代码只能防止不懂js的用户,如果碰到懂得js的编程人员,那js方法就没用了。
方案二:设置HTTP报头
设置HTTP报头,控制表单缓存,使得所控制的表单不缓存信息,这样用户就无法通过重复点击按钮去重复提交表单。服务类编写
指定 5s 内克制重复提交。- @Resubmit(ttl = 5)
- public void queryInfo(final String id) {
- System.out.println("query info: " + id);
- }
复制代码 测试代码
相同的参数 5s 内直接提交2次,就会报错。- @Test(expected = ResubmitException.class)
- public void errorTest() {
- UserService service = ResubmitProxy.getProxy(new UserService());
- service.queryInfo("1");
- service.queryInfo("1");
- }
复制代码 核心实现
界说注解
首先,我们界说一个注解。
[code]import com.github.houbb.resubmit.api.support.ICache;import com.github.houbb.resubmit.api.support.IKeyGenerator;import com.github.houbb.resubmit.api.support.ITokenGenerator;import java.lang.annotation.*;/** * @author binbin.hou * @since 0.0.1 */@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)@Documentedpublic @interface Resubmit { /** * 缓存实现策略 * @return 实现 * @since 0.0.1 */ Class |