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月8日
    288
  • 二进制实现加法_递归实现十进制转换二进制

    二进制实现加法_递归实现十进制转换二进制一、原理1、化简先看一个例子:看一下3+4的加法运算3的二进制表示:0114的二进制表示:1003^4(3按位异或4)的结果是:111=>7上面的到的结果是

    2022年8月3日
    7
  • C51单片机LCD1602驱动程序

    C51单片机LCD1602驱动程序C51单片机LCD1602驱动程序LCD1602简介1602的引脚操作时序写操作时序时序参数LCD1602关键性操作一、初始化二、清屏指令二、进入模式设置指令三、显示开关控制指令四、功能设定指令RAM地址映射图LCD1602简介LCD1602字符型液晶(每行显示16个字符,一共可以显示两行)——一种专门用来显示字母、数字、符号的点阵型液晶模块。它由若干个57或者510的点阵字符组成,每个点阵字符位都可以用来显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此

    2022年7月16日
    18
  • linux(6)查看进程ps命令「建议收藏」

    linux(6)查看进程ps命令「建议收藏」ps命令Linuxps(英文全拼:processstatus)命令用于显示当前进程的状态,类似于windows的任务管理器查看所有进程ps-A显示所有进程信息,连同命令行ps-

    2022年7月28日
    4
  • vue3 路由传参_vue router传参

    vue3 路由传参_vue router传参前言vue路由传参的使用场景一般都是应用在父路由跳转到子路由时,携带参数跳转。传参方式可划分为params传参和query传参,而params传参又可分为在url中显示参数和不显示参数两种方式,这就是vue路由传参的三种方式。方式一:params传参(显示参数)params传参(显示参数)又可分为声明式和编程式两种方式1、声明式router-link该…

    2025年8月22日
    7
  • Android Sdk安装和环境变量配置[通俗易懂]

    Android Sdk安装和环境变量配置[通俗易懂]AndroidSdk安装 AndroidSdk环境变量配置 参考:https://blog.csdn.net/qq_21454973/article/details/80429545一:AndroidSdk安装下载AndroidSDK(SoftwareDevelopmentKit)GoogleAndroid的官网上下载(http://developer.an…

    2022年7月21日
    19

发表回复

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

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