API接口重复提交

API接口重复提交

重复提交的几种情况
1、利用JavaScript防止表单重复提交

       按钮禁用
2、利用Session令牌防止表单重复提交

具体的做法:在服务器端生成一个唯一的随机标识号,专业术语称为Token(令牌),同时在当前用户的Session域中保存这个Token。然后将Token发送到客户端的Form表单中,在Form表单中使用隐藏域来存储这个Token,表单提交的时候连同这个Token一起提交到服务器端,然后在服务器端判断客户端提交上来的Token与服务器端生成的Token是否一致,如果不一致,那就是重复提交了,此时服务器端就可以不处理重复提交的表单。如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。
  在下列情况下,服务器程序将拒绝处理用户提交的表单请求:

    存储Session域中的Token(令牌)与表单提交的Token(令牌)不同。
    当前用户的Session中不存在Token(令牌)。
    用户提交的表单数据中没有Token(令牌)。
    后端代码

public class FormServlet extends HttpServlet {
     private static final long serialVersionUID = -884689940866074733L;
 
     public void doGet(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
 
         String token = TokenProccessor.getInstance().makeToken();//创建令牌
         System.out.println("在FormServlet中生成的token:"+token);
         request.getSession().setAttribute("token", token);  //在服务器使用session保存token(令牌)
         request.getRequestDispatcher("/form.jsp").forward(request, response);//跳转到form.jsp页面
     }
 
     public void doPost(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
         doGet(request, response);
     }
 
}

3、对外接口(服务端调用服务端)如何防止重复提交

    可以设置字段状态,在某种状态插入,某种状态下更新,某种状态下不插入,达到幂等性
4、后端服务器如何简单的避免重复提交

       业务场景:用户点击购买后,修改订单状态,修改用户账户余额,并添加用户消费记录。

分析:这里在同一个事务里有三个动作,两个是更新,一个是添加。如果这时候在更新完出现并发情况,那么用户消费记录可能会多出一条,用户账户余额也可能出现错误。那么该如何防止呢?在修改前查询订单状态判断是否已经修改过明显不能解决问题,因为并发可能发生在查询之后。

解决思路:数据库一般默认update操作会占有一个行级锁,当第一次请求的事务还未结束时,第二次重复请求是无法修改这条记录的。我们让修改操作都加上一个修改前的条件判断,这样第二次请求再来修改的时候会发现修改不成功,这时回滚事务即可避免并发。

解决办法:在修改订单时增加一个判断(判断其应该是未支付的订单),然后返回更新的记录条数,如果为0则抛出异常,回滚当前事务。

sql语句如下:

update order set status = 1 where oid = 1 and status = 0;

在mybatis中可以获取记录更新的条数

int update(Map map);

5、在数据库添加约束

在数据库里添加唯一约束或者创建唯一索引,防止出现重复数据。是最有效的防治重复提交的方法了。

出现异常,回滚
6、使用Post/Redirect/Get

Post/Redirect/Get简称PRG,是一种可以防止表单数据重复提交的一种Web设计模式,像用户刷新提交响应页面等比较典型的重复提交表单数据的问题可以使用PRG模式来避免。例如:当用户提交成功之后,执行客户端重定向,跳转到提交成功页面。

   注意:PRG设计模式并不适用所有的重复提交情况,比如:

       1)由于服务器响应缓慢,用户刷新提交POST请求造成的重复提交。

       2)用户点击后退按钮,返回到数据提交界面,导致的数据重复提交。

       3)用户多次点击提交按钮,导致的数据重复提交。

       4)用户恶意避开客户端预防多次提交手段,进行重复数据提交

原文:https://blog.csdn.net/douxingpeng1/article/details/81708205

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/112498.html原文链接:https://javaforall.net

(0)
上一篇 2021年11月6日 下午6:00
下一篇 2021年11月6日 下午6:00


相关推荐

  • word转pdf的java实现_java实现word转pdf

    word转pdf的java实现_java实现word转pdf文章时间:2020-12-516:38:54解决问题:java实现word转pdf目前发现可用的实现方式有两种,一种是使用e-iceblue的免费版api,此方法最为简单但存在限制,导出页数不能超过三页。另一种是使用openoffice,但较上一种方法麻烦一些,需要安装openoffice的软件,但没有导出限制,请根据自身需求自行选用。方式一e-iceblue的免费版api官方文档https:…

    2022年6月8日
    117
  • 逻辑回归(Logistic Regression)详解

    逻辑回归(Logistic Regression)详解逻辑回归也称作logistic回归分析,是一种广义的线性回归分析模型,属于机器学习中的监督学习。其推导过程与计算方式类似于回归的过程,但实际上主要是用来解决二分类问题(也可以解决多分类问题)。通过给定的n组数据(训练集)来训练模型,并在训练结束后对给定的一组或多组数据(测试集)进行分类。其中每一组数据都是由p个指标构成。(1)逻辑回归所处理的数据逻辑回归是用来进行分类的。例如,我们给出一个人的[身高,体重]这两个指标,然后判断这个人是属于”胖“还是”瘦“这一类。对于这个问题,我们可以先测量n个

    2025年7月29日
    10
  • 365xav.cf/forum.php,jupyterlab-latex

    365xav.cf/forum.php,jupyterlab-latex#THISISANAUTOGENERATEDFILE.DONOTEDITTHISFILEDIRECTLY.#yarnlockfilev1″@babel/code-frame@^7.0.0″:version”7.8.3″resolved”https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3….

    2026年4月16日
    8
  • 免费AI聊天工具入口汇总推荐

    免费AI聊天工具入口汇总推荐

    2026年3月13日
    2
  • sql 中文转拼音首字母

    sql 中文转拼音首字母

    2021年10月14日
    51
  • 计算机科学经典著作(留作纪念)

    计算机科学经典著作(留作纪念)以下著作均可在此地址下载 nbsp nbsp nbsp nbsp http www verycd com topics 24717 中文名称 计算机科学经典著作英文名称 ComputerScie 版本 2 日更新 简介 1 TheArtofComp 无图片 Author Donald E Knuth Website nbsp http www

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号