且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

防直接访问 防重复提交

更新时间:2022-08-16 23:35:42

防止直接访问PHP页面
1.可以在A加COOKIE,B判断COOKIE后用完删掉COOKIE
2. 使用$_SERVER['HTTP_REFERER'] 得到链接到当前页面的前一页面的地址
3.token令牌

Java代码  防直接访问 防重复提交
  1. <?php  
  2. /* 
  3. * PHP简单利用token防止表单重复提交 
  4. * 此处理方法纯粹是为了给初学者参考 
  5. */  
  6. session_start();  
  7. function set_token()  
  8. {  
  9.     $_SESSION['token'] = md5(microtime(true));  
  10. }  
  11.   
  12. function valid_token()  
  13. {  
  14.     $return = $_REQUEST['token'] === $_SESSION['token'] ? true : false;  
  15.     set_token();  
  16.     return $return;  
  17. }  
  18.   
  19. //如果token为空则生成一个token  
  20. if (!isset($_SESSION['token']) || $_SESSION['token'] == '') {  
  21.     set_token();  
  22. }  
  23.   
  24. if (isset($_POST['test'])) {  
  25.     if (!valid_token()) {  
  26.         echo "token error";  
  27.     } else {  
  28.         echo '成功提交,Value:' . $_POST['test'];  
  29.     }  
  30. }  
  31. ?>  
  32. <form method="post" action="">  
  33.     <input type="hidden" name="token" value="<?php echo $_SESSION['token'] ?>">  
  34.     <input type="text" name="test" value="Default">  
  35.     <input type="submit" value="提交"/>  
  36. </form>  

基于业务方面的控制

1)基于DB中退款订单状态的验证

2)利用数据库唯一索引机制的验证

3)基于缓存的计数器验证:

由于数据库的操作比较消耗性能,了解到redis的计数器也是原子性操作。果断采用计数器。既可以提高性能,还不用存储,而且能提升qps的峰值。还是以订单退款为例子:
每次request进来则新建一个以orderId为key的计数器,然后+1。如果>1(不能获得锁): 说明有操作在进行,删除。如果=1(获得锁): 可以操作。操作结束(删除锁):删除这个计数器。
防直接访问 防重复提交
 

前端防止重复提交,禁用按钮或链接

Java代码  防直接访问 防重复提交
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">  
  2. <html>  
  3. <head>  
  4. <title>测试</title>  
  5. </head>  
  6. <script language="javascript">  
  7. var t = null;  
  8. var flag = true;  
  9. function check(obj) {  
  10.     if (flag) {  
  11.         obj.disabled = flag;  
  12.         flag = false;  
  13.         t = setTimeout(function(){disable(obj)}, 5000); // 5秒间隔  
  14.         window.open("http://www.baidu.com""newWindow");  
  15.     }  
  16. }  
  17.   
  18. function disable(obj) {  
  19.     obj.disabled = flag;  
  20.     flag = true;  
  21.     if (t != null)  
  22.     clearTimeout(t);  
  23. }  
  24. </script>  
  25. <body>  
  26. <a href="#" onclick="check(this)">ceshi1</a>  
  27. </body>  
  28. </html>  

9秒后按钮激活代码

Java代码  防直接访问 防重复提交
  1. <input class="button" type="submit" name="rulesubmit" value="同 意" style="height: 23px">  
  2. <input class="button" type="button" name="return" value="不同意" style="height: 23px" onclick="javascript:history.go(-1);">  
  3. </center>  
  4. </form>  
  5.   
  6. <script type="text/javascript">  
  7. var secs = 9;  
  8. var wait = secs * 1000;  
  9. document.bbrules.rulesubmit.value = "同 意(" + secs + ")";  
  10. document.bbrules.rulesubmit.disabled = true;  
  11. for(i = 1; i <= secs; i++) {  
  12.         window.setTimeout("update(" + i + ")", i * 1000);  
  13. }  
  14. window.setTimeout("timer()", wait);  
  15. function update(num, value) {  
  16.         if(num == (wait/1000)) {  
  17.                 document.bbrules.rulesubmit.value = "同 意";  
  18.         } else {  
  19.                 printnr = (wait / 1000) - num;  
  20.                 document.bbrules.rulesubmit.value = "同 意(" + printnr + ")";  
  21.         }  
  22. }  
  23. function timer() {  
  24.         document.bbrules.rulesubmit.disabled = false;  
  25.         document.bbrules.rulesubmit.value = "同 意";  
  26. }  
  27. </script>  

jQuery one当使用 one() 方法时,每个元素只能运行一次事件处理器函数

Java代码  防直接访问 防重复提交
  1. $("p").one("click",function(){    
  2. });  
2324