2.客户端防表单重复提交和服务器端防表单重复提交

1.客户端防表单重复提交

   <form action="" method="post" οnsubmit="return dosubmit()" >

<script type="text/javascript">
            //定义一个全局变量
            var iscommitted = false;
            function dosubmit() {
                if(!iscommitted) {
                    //第一次提交,变为true
                    iscommitted = true;
                    return true;
                } else {
                    return false;
                    
                }
            }
        
        </script>


另一种:让按钮变成灰色


<script type="text/javascript">
            function dosubmit() {
                //根据id查询 提交按钮
                var input = document.getElementById("submit");
                input.disabled='disabled';
                return true;
            }
        
        </script>


<form action="" method="post" οnsubmit="return dosumit()" >
        用户名:<input type="text" name="username" />
        <input  id="submit" type="submit" value="提交" />
    </form>

这样防止不了恶意用户进行重复提交的;

客户端防止重复提交存在问题:

把页面另存为一个html,自己构建一个表单,把js代码去掉,然后提交。

 

如果把按钮变成diabled,不可以点击按钮,但是可以刷新啊,刷新就是把上次干的事情,在做一次。

 

还可以点击后退,在点击提交。

不过实际开发也要用,防君子。

2.服务器端防止表单重复提交

思路:1.生成表单的servlet,生成一个随机数,把这个随机数保存到session中

             2.表单提交会带上这个随机数

             3.把表单带过来的随机数与服务器中session里面比较

             4.如果一致,提交表单,删除session中的这个随机数


生成表单的servlet,主要是生成随机数,放到session中

request.getSession().setAttribute("token", token);

在提交表单时,使用一个隐藏域,<input type="hidden" name="token" value=''

${token}" >

处理表单的Servlet

1.首先确认表单是否有效

  boolen  b = isTokenValid(request);

2.返回true,有效,可以提交

 返回false,不让提交

  if(!b) {

      System.out.println("请不要重复提交");

      return ;

   }

表单处理完毕后,删除随机数

request.getSession().removeAttribute("token");



判断表单号是否有效的方法思路

private boolean  isTokenValid(HttpSerfvletRequest request) {}

1.获取客户端带过来的随机数

  String clientToken = request.getParameter("token");

  没有带表单号,也认为是重复提交

   if(clientToken == null) {

           return false;

    }


 2.获得服务器存在session里面的token

   String  serverToken =(String) request.getSession.getAttribute("token");

   如果服务端没有,也认为是重复提交

   if(serverToken == null) {

       return false;

    }

 3.判断是否一致

      if(!clientToken .equals(serverToken)) {

         return false;

    }

return true;


第一次提交以后,刷新也不让提交,后退在提交也不让。







  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值