防止重复提交最好的方法
2023-02-17阅读(148)
问:银行网银防止重复提交的方法
- 答:银行网银防止重复提交的方法是:
在网银的数据库中新建一个表,就一个字段(主键),用于储存流水号,在发银行核心系统之前,将要转帐的这笔流水insert到此表中(此时第二个柜员就无法再次录入这笔交易了,利用数据库的锁,防止了重复提交),当核心返回数据后判断:
当返回的数据是一个连接异常时,删去数据库中这笔流水;
当返回的数据是一个返回超时异常时,不做任何处理;
当返回的数据是核心交易异常时,删去数据库中这笔流水;
当返回的数据是交易成功时,不做处理。
问:token防止前端重复提交
- 答:关于表单重复提交的控制在不同的层面有不同的实现方法。最简单的就是前端按钮提交之后置灰控制。另外对于绕过前端恶意重复提交的行为就需要在服务端进行控制。大致分为两类。第一类为web容器对请求进行控制,第二类为业务系统幂等控制。
这里介绍一下通过token实现web容器重复请求控制。
原理: 1表单打开时向后端申请一个token。
2表单提交时将token一并提交
3controller处理请求时检查token,如果token存在则删除这个token并判定请求合法。
注意:redis要用删除操作来判断token,删除成功代表token校验通过,如果用select+delete来校验token,存在并发问题,不建议使用
实现例子:
1 创建一个TokenUtil类,用来生成token和token校验
2获取token的controller
3 token判定的应用
问:php 提交表单到当前页面如何防止页面刷新重复提交~
- 答:最常用的方法就是利用token。即:
1、在生成页面的时候生成一个token(随机字符串),并把它同时写入表单的某个hidden中,和服务端的session中。
2、客户端提交表单到服务器时,比对表单中的token与session中的token是否一致。若不一致则认为是无效的请求。
3、不管第2步的校验是否通过,token只要使用一次后就立即作废(即:从session中销毁)。同时token也可以关联时间信息,超时后也自动作废。
这样,即便客户端重复提交,也只有第一次的请求能够成功。