请求转发下刷新页面重复提交原因_表单重复提交的三种情况及解决办法

第一种情况:提交完表单以后,不做其他操作,直接刷新页面,表单会提交多次。

在servlet中写一句输出,用来判断是否提交多次

System.out.println("已经插入");

request.getRequestDispatcher("/login_success.jsp").forward(request, response);

这样的话,刷新多少次,就会在控制器显示多少个“已经插入”。

根本原因:Servlet处理完请求以后,直接转发到目标页面,这样整个业务只发送了一次请求,那么当你在浏览器中点击刷新会一直都会刷新之前的请求。

解决方法:不用转发到另一页面,采用重定向的方式跳转到目标页面

response.sendRedirect("/day0815-session/login_success.jsp");

第二种情况:在提交表单时,如果网速较差,可能会导致点击提交按钮多次,这种情况也会导致表单重复提交。

解决方法:点击提交按钮之后,使按钮不可用。通过js完成

var btn = document.getElementById("btn");//为按钮绑定单击响应函数

btn.onclick =function(){//点击以后使按钮不可用

this.disabled=true;//当将提交按钮设置为不可用时,会自动取消它的默认行为//手动提交表单

this.parentNode.submit();

};

};


user:
password

注意“提交”按钮,此时已经不可按!

第三种情况:表单提交成功以后,直接点击浏览器上回退按钮,不刷新页面,然后点击提交按钮再次提交表单。

-根本原因:因为服务器在处理请求时,不会检查是否为重复提交的请求。

解决方案:

使用一个token的机制

- token就是令牌的意思

- 服务器在处理请求之前先来检查浏览器的token

- token由服务器来创建,并交给浏览器,浏览器在向服务器发送请求时需要带着这个token

- 服务器处理请求前检查token是否正确,如果正确,则正常处理,否则返回一个错误页面

- 服务器所创建的token只能使用一次

- token一般使用一个唯一的标识

在jsp页面,获取uuid作为token

-UUID:32位字符串,通常作为对象或者表的唯一标识,根据机器码和时间戳(从1970年1月1日开始到现在)生成。

session.setAttribute("uuid", uuid);%>
${errormsg }


  user:
  password

- 在servlet页面

String reqUUID = request.getParameter("uuid");

HttpSession session=request.getSession();

String sessUUID= (String) session.getAttribute("uuid");

session.removeAttribute("uuid");if(reqUUID.equals(sessUUID)){

response.sendRedirect(request.getContextPath()+"/login_success.jsp");

System.out.println("已经插入");

}else{

request.setAttribute("errormsg", "重复登陆");

request.getRequestDispatcher("/3.jsp").forward(request, response);

}

表单重复提交的危害:

- 向数据库中插入大量的重复且没有意义的数据,占用服务器的资源

- 处理请求服务器并没有检查请求是否为重复的请求,导致恶意的攻击

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值