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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SSH_三大框架简单介绍

    SSH_三大框架简单介绍

    2021年7月10日
    110
  • pycharm配置运行环境_服务器运行失败怎么办

    pycharm配置运行环境_服务器运行失败怎么办今天讲一下,如何使用pycharm关联服务器代码,以及使用本地文件启动,服务器环境。1、设置连接填写服务器信息,ip地址,端口号,登录用户,密码,选择好服务器项目的路径。配置服务器同步运行环境输入密码设置路径,选择python路径,和你同步路径设置好以后,完成。然后启动,本地项目设置。设置好以后,启动本地项目。然后使用服务器地址,访问8000端口。在浏览器,使服务器的ip+8000端口,访问。即可。且,在本地修改代码,会时时同步

    2022年8月26日
    4
  • python在线音乐播放器_python实现音乐播放器「建议收藏」

    python在线音乐播放器_python实现音乐播放器「建议收藏」python是一个比较活泼的语言,它可以很快速、很方便地实现很多有意思的东西。最近,学习了一下如何使用python制作一个简单的音乐播放器,整体的效果如下图所示。所需要的导入的库tkinterostimethreadingpygame如果没有安装这个库,简单粗暴的pipinstall+库例如,我没有安装过pygame这个库,准备工作下载音乐,喜欢的歌曲,选择mp3格式这里,给大家提供一个…

    2022年6月26日
    43
  • leetcode516_leetcode46

    leetcode516_leetcode46Givenacollectionofnumbers,returnallpossiblepermutations.Forexample,[1,2,3] havethefollowingpermutations:[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2],and [3,2,1].思路:递归咯c

    2022年9月20日
    2
  • RTP协议分析

    RTP协议分析整理记录版本时间内容整理人

    2022年4月19日
    52
  • spss相关系数及其检验_等级相关系数法检验

    spss相关系数及其检验_等级相关系数法检验这里写目录标题SPSS的异方差检验(等级相关系数检验法)数据来源普通最小二乘法求回归方程功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导…

    2025年8月2日
    4

发表回复

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

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