API接口重复提交

举报
lxw1844912514 发表于 2022/03/27 02:54:20 2022/03/27
【摘要】 重复提交的几种情况1、利用JavaScript防止表单重复提交       按钮禁用2、利用Session令牌防止表单重复提交具体的做法:在服务器端生成一个唯一的随机标识号,专业术语称为Token(令牌),同时在当前用户的Session域中保存这个Token。然后将Tok...

重复提交的几种情况
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

文章来源: blog.csdn.net,作者:lxw1844912514,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/lxw1844912514/article/details/100029106

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。