java中避免表单重复提价的方法

一,利用js防止表单重复提交
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
  <head>
    <title>Form表单</title>
        <script type="text/javascript">
        var isCommitted = false;//表单是否已经提交标识,默认为false
        function dosubmit(){
            if(isCommitted==false){
                isCommitted = true;//提交表单后,将表单是否已经提交标识设置为true
                return true;//返回true让表单正常提交
            }else{
                return false;//返回false那么表单将不提交
            }
        }
    </script>
  </head>
  
  <body>
      <form action="${pageContext.request.contextPath}/servlet/DoFormServlet" οnsubmit="return dosubmit()" method="post">
        用户名:<input type="text" name="username">
        <input type="submit" value="提交" id="submit">
    </form>
  </body>
</html>
二,将表单提交后按钮设置为不可用
1 function dosubmit(){
2     //获取表单提交按钮
3     var btnSubmit = document.getElementById("submit");
4     //将表单提交按钮设置为不可用,这样就可以避免用户再次点击提交按钮
5     btnSubmit.disabled= "disabled";
6     //返回true让表单可以正常提交
7     return true;
8 }
三,利用session防止表单重复提交

 具体的做法:在服务器端生成一个唯一的随机标识号,专业术语称为Token(令牌),同时在当前用户的Session域中保存这个Token。然后将Token发送到客户端的Form表单中,在Form表单中使用隐藏域来存储这个Token,表单提交的时候连同这个Token一起提交到服务器端,然后在服务器端判断客户端提交上来的Token与服务器端生成的Token是否一致,如果不一致,那就是重复提交了,此时服务器端就可以不处理重复提交的表单。如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。
  在下列情况下,服务器程序将拒绝处理用户提交的表单请求:

       存储Session域中的Token(令牌)与表单提交的Token(令牌)不同。

       当前用户的Session中不存在Token(令牌)

       用户提交的表单数据中没有Token(令牌)

   1,用于生成 Token(令牌) 和跳转到form.jsp页面
   @作者: chencong
* @项目: mail--cc.ccoder.mail.utils * @时间: 2017年6月7日下午7:05:14 * @TODO: 生成随机字符串的工具类 uuid */ public class UUIDUtils { public static String getUUID (){ return UUID.randomUUID().toString().replace( "-" , "" ); }
String token = UUIDUtils . getUUID();//获取token
   session.setAttribute("token", token);//保存token
2. 在form.jsp中使用隐藏域来存储 Token(令牌)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  <html>
  <head>
  <title>form表单</title>
  </head>
  <body>
      <form action="${pageContext.request.contextPath}/servlet/DoFormServlet" method="post">
         <%--使用隐藏域存储生成的token--%>         <%--
            <input type="hidden" name="token" value="<%=session.getAttribute("token") %>">
         --%>
         <%--使用EL表达式取出存储在session中的token--%>
         <input type="hidden" name="token" value="${token}"/> 
         用户名:<input type="text" name="username"> 
         <input type="submit" value="提交">
     </form>
 </body>
 </html>
3. DoFormServlet处理表单提交
String correctToken = (String) session.getAttribute("token");
String token = reuest.getParmater(“token ”);
if (StringUtils.isBlank(token) || !token.equalsIgnoreCase(correctToken)) {
return "success";
}
session.removeAttribute("token");移除token
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值