精华内容
下载资源
问答
  • 一、出现form表单重复提交问题 1、点击提交按钮两次。 2、点击刷新按钮。 3、使用浏览器后退按钮重复之前的操作,导致重复提交表单。 4、使用浏览器历史记录重复提交表单。 5、浏览器重复的 HTTP 请求。 二、防止...

    一、出现form表单重复提交问题

    1、点击提交按钮两次。
    2、点击刷新按钮。
    3、使用浏览器后退按钮重复之前的操作,导致重复提交表单。
    4、使用浏览器历史记录重复提交表单。
    5、浏览器重复的 HTTP 请求。

    二、防止表单重复提交的方法

    1、禁掉提交按钮

    表单提交后使用 Javascript 使提交按钮disable。这种方法防止心急的用户多次点击按钮。但有个问题,如果客户端把 Javascript 给禁止掉,这种方法就无效了。

    2、Post/Redirect/Get 模式

    在提交后执行页面重定向,这就是所谓的 Post-Redirect-Get (PRG)模式。简言之,当用户提交了表单后,你去执行一个客户端的重定向,转到提交成功信息页面。

    这能避免用户按 F5 导致的重复提交,而其也不会出现浏览器表单重复提交的警告,也能消除按浏览器前进和后退按导致的同样问题。

    3、在 session 中存放一个特殊标志

    当表单页面被请求时,生成一个特殊的字符标志串,存在 session 中,同时放在表单的隐藏域里。接受处理表单数据时,检查标识字串是否存在,并立即从 session 中删除它,然后正常处理数据。如果发现表单提交里没有有效的标志串,这说明表单已经被提交过了,忽略这次提交。这使你的 web 应用有了更高级的 XSRF 保护。

    4、使用Cookie处理

    使用Cookie记录表单提交的状态,根据其状态可以检查是否已经提交表单。

    5、在数据库里添加约束

    在数据库里添加唯一约束或创建唯一索引,防止出现重复数据。这是最有效的防止重复提交数据的方法。

    展开全文
  • form表单防止重复提交的N种方法

    千次阅读 2019-04-29 17:17:50
    Form表单重复提交是在多用户Web应用中最常见、带来很多麻烦的一个问题。有很多的应用场景都会遇到重复提交问题,比如: (1)点击提交按钮两次。 (2)点击刷新按钮。 (3)使用浏览器后退按钮重复之前的操作,导致重复...

    Form表单重复提交是在多用户Web应用中最常见、带来很多麻烦的一个问题。有很多的应用场景都会遇到重复提交问题,比如:

    (1)点击提交按钮两次。

    (2)点击刷新按钮。

    (3)使用浏览器后退按钮重复之前的操作,导致重复提交表单。

    (4)使用浏览器历史记录重复提交表单。

    (5)浏览器重复的HTTP请求。

    (6)用户提交表单时可能因为网速的原因,或者网页被恶意刷新,致使同一条记录重复插入到数据库中,这是一个比较棘手的问题。我们可以从客户端和服务器端一起着手,设法避免同一表单的重复提交。

    参考网友建议和自己的体会,收集了以下几种有效防止表单重复提交的方法:

     

    一、用Javascript禁掉提交按钮

    表单提交之后,用JS置灰submit按钮,可防止心急用户重复点击提交按钮。

    示例代码如下:

    <script type="text/javascript">
        //设置disabed属性
        $("input[type='submit']").attr("disabled",true);
        或者 $("input[type='submit']").attr("disabled","disabled");
        
        //移除disabed属性
        $("input[type='submit']").attr("disabled",false);
        或者 $("input[type='submit']").attr("disabled","");
    </script>

    如果客户端禁用JS,这种方法就会失效。

     

    二、在数据库里添加唯一约束( 仅仅针对添加的表单操作 )

    在数据库里添加唯一约束或创建唯一索引,防止出现重复数据。这是最有效的防止重复提交数据的方法。

    //创建表时创建唯一性约束
    
    //在mysql中添加唯一约束:
    CREATE TABLE `T_User` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `username` varchar(18) NOT NULL unique,
      `password` varchar(18) NOT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1018 DEFAULT CHARSET=gbk;
     
     
    //在oracle中添加唯一约束:
    create table `T_User`
    (
      `id` number not null,
      `username`  varchar2(50),
      `password`  varchar2(50),
      CONSTRAINT tb_user_u1 UNIQUE (`id`)
    );
    

    三、用Redirect-After-Post模式

    1、用sendRedirect()函数转向

    用户提交表单之后,执行重定向,转到成功信息页面。可避免用户按F5刷新页面和点击浏览器前进或后退导致的重复提交

    示例代码如下:

    public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException,IOException{
      response.setContentType("text/html; charset=utf-8");
      response.sendRedirect("/success.jsp");
    }

    2、用forward()函数转向

    除此之外,当用户提交表单,服务器端调用forward()方法,转发到其他页面。示例代码如下:

    public void doPost(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException,IOException{
      response.setContentType("text/html; charset=utf-8");
      ServletContext sc = getServletContext();
      sc.getRequestDispatcher("/success.jsp").forward(request, response);
    }


    四、用Session防止表单重复提交

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

    在下列情况下,服务器程序将拒绝处理用户提交的表单请求:

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

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

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

    示例代码如下:

    1、创建FormServlet,用于生成Token(令牌)和跳转到form.jsp页面

    public class FormServlet extends HttpServlet {
        private static final long serialVersionUID = -884689940866074733L;
     
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
     
            String token = UUID.randomUUID().toString();//创建令牌
            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);
        }
     
    }


    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处理表单提交

    public class DoFormServlet extends HttpServlet {
     
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                    throws ServletException, IOException {
     
                boolean b = isRepeatSubmit(request);//判断用户是否是重复提交
                if(b==true){
                    System.out.println("请不要重复提交");
                    return;
                }
                request.getSession().removeAttribute("token");//移除session中的token
                System.out.println("处理用户提交请求!!");
            }
            
            /**
             * 判断客户端提交上来的令牌和服务器端生成的令牌是否一致
             * @param request
             * @return 
             *         true 用户重复提交了表单 
             *         false 用户没有重复提交表单
             */
            private boolean isRepeatSubmit(HttpServletRequest request) {
                String client_token = request.getParameter("token");
                //1、如果用户提交的表单数据中没有token,则用户是重复提交了表单
                if(client_token==null){
                    return true;
                }
                //取出存储在Session中的token
                String server_token = (String) request.getSession().getAttribute("token");
                //2、如果当前用户的Session中不存在Token(令牌),则用户是重复提交了表单
                if(server_token==null){
                    return true;
                }
                //3、存储在Session中的Token(令牌)与表单提交的Token(令牌)不同,则用户是重复提交了表单
                if(!client_token.equals(server_token)){
                    return true;
                }
                
                return false;
            }
     
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
     
    }

    详情参考: http://www.cnblogs.com/xdp-gacl/p/3859416.html

     

    五、用Struts2的token机制

    Struts2中的token标签可以用来生成一个唯一的标记,这个标记必须嵌套在form标签内使用,它将在form表单里插入一个隐藏字段并把标记保存到Session中。

    示例代码如下:

    1、在struts.xml里面需要进行如下配置:

    <packagename="default"namespace="/"extends="struts-default">
        <action name="submit"class="action.SubmitAction">
            <result name="success">/success.jsp</result>
            <result name="invalid.token">/input.jsp</result>
             
            <interceptor-ref name="tokenSession"></interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
        </action>
    </package>


    2、在需要提交的jsp页面加上<s:token></s:token>标签 (要使用token机制,必须使用struts2提供的标签库)

    <form action="submit.action" method="post">
          name : <input type="text" name="name"/><br/>
          password : <input type="text" name=password/><br>
          <s:token></s:token>
          <input type="submit" value="submit"/>
    </form>


    详情参考:https://blog.csdn.net/jdluojing/article/details/7611254


    六、用Cookie做处理以User(假设有一个user类)举例说明,将用户id和"ok" + id分别放到cookie里面,根据需要设置cookie存活时间,然后放到response里面。在每次提交form表单时,先判断cookie中的name是否是已经提交过的表单名称,如果是就重定向到error页面。 如果客户端禁止了Cookie,该方法将不起任何作用

    示例代码如下:

    Cookie[] cookies = request.getCookies();
    for (Cookie cookie : cookies) {
        if (String.valueOf(user.getId()).equals(cookie.getValue())) {
            response.sendRedirect("error.jsp");
        } else {
        Cookie cookie2 = new Cookie("ok" + user.getId(), String.valueOf(user.getId()));
        response.addCookie(cookie2);
        }
    }

     
    作者:Paul Wen 
    来源:CSDN 
    原文:https://blog.csdn.net/Huozhiwu_11/article/details/78742886 
    版权声明:本文为博主原创文章,转载请附上博文链接!

     

    展开全文
  • 会引起表单重复提交的情况: f5刷新页面, 点击浏览器后退,重复点击提交按钮 前台: 1. 提交后按钮置灰,或者添加蒙板 2. PRG模式,表单提交后,redirect到一个倒计时页面,或者信息提示页面,等有成功信息返回...

    会引起表单重复提交的情况:

    f5刷新页面, 点击浏览器后退,重复点击提交按钮

    前台:

    1. 提交后按钮置灰,或者添加蒙板

    2. PRG模式,表单提交后,redirect到一个倒计时页面,或者信息提示页面,等有成功信息返回后,再跳转回之前页面。

    3. js中设置标记为判断

    后台:

    1 session方式,当表单页面被请求时,生成一个特殊的字符标志串,存在session中,同时放在表单的隐藏域里。接受处理表单数据时,检查标识字串是否存在,如果存在,且表单中和session中相等,那么提交表单,并立即从session中删除它。再次请求过来,如果发现表单提交里没有有效的标志串,这说明表单已经被提交过了,属于重复提交。

    2 spring mvc防止重复提交,

    数据库:

    数据库中做唯一性约束

    参考:

    https://www.cnblogs.com/ciaoit/p/7714630.html

    原文链接:https://blog.csdn.net/u012491783/article/details/79736343

    展开全文
  • 为什么要避免form表单重复提交呢?因为我们不想让我们的服务器重复处理没必要的数据,同时我们也是避免我们的数据库产生重复的数据,避免表单重复提交也是让我们的网站更安全的一种表现。 先看一下有哪些情况下回...
  •  场景一、刷新页面,form表单内容被重复提交。  解决思路分2部分,前端页面和后端代码。  前端页面:在做from 表单提交的时候不使用原生的FROM html语法提交,定义一个js的function来获取数据进行提交。触发...

             现在分2种场景描述:

             场景一、刷新页面,form表单内容被重复提交。

                     解决思路分2部分,前端页面和后端代码。

              前端页面:在做from 表单提交的时候不使用原生的FROM html语法提交,定义一个js的function来获取数据进行提交。触发事件后,删除提交按钮上的from方法。

              后端代码:防止重复提交。

                    方式一、代码提交的 Contraller处理完成后跳转到另一个请求的contraller,在新的contraller中跳转到新的页面。

                    方式二、在登录用户的Session中,放置一个随机数作为同步标记,并在初始化新增或编辑页面时就返回到前台页面中,用隐藏域赋值,当form被提交时,form中的同步标记就和Session中的同步标记作对比。在form首次提交的时候,这两个标记应该是一样的。如果标记不一样,那么该form就会禁止提交,一个错误就会返回给用户。在用户提交一个form时,如果按下浏览器中的后退按钮并尝试重新提交同一个form时,标记就会出现不匹配的现象。

           另一方面,如果两个标记值匹配,那么我们就可以确信整个流程是正确的。在这种情况下,Session中的标记值就会被修改为一个新的值,同时允许提交该form。 

          还可以使用这个策略来控制对某些页面的直接访问,就好象上面资源保护中描述的一样。例如,假设一个用户将某个应用的页面A收藏到收藏夹中,而页面A 只允许通过页面B和C访问。当用户直接通过收藏夹来访问页面A,这时页面的访问顺序就是不正确的,这样同步标记将处在一个不同步的状态,或者它根本就不存在。不论怎样,访问都被禁止了。

           

           场景二、同一个用户登录在不同的浏览器里,打开同一个from表单提交数据。

                   解决思路:暂时还没想好。谁能提供下解决思路。。。。

     

     

    展开全文
  • 防止form表单重复提交

    千次阅读 2018-07-23 10:24:45
    通常情况,出现from表单重复提交的情况包括: (1)点击提交按钮两次。 (2)点击刷新按钮。 (3)使用浏览器后退按钮重复之前的操作,导致重复提交表单。 (4)使用浏览器历史记录重复提交表单。 (5)浏览器重复的HTTP...
  • 阅读目录前言form重复提交场景解决方案一:前端利用JavaScript防止表单重复提交二:利用Session防止表单重复提交参考 前言 如果网速比较慢的情况下,用户点击的提交发现半天没有反映,于是又重新点击了几次提交按钮...
  • 防止form表单重复提交的X种方法

    万次阅读 2017-12-07 16:29:42
    Form表单重复提交是在多用户Web应用中最常见、带来很多麻烦的一个问题。有很多的应用场景都会遇到重复提交问题,比如: (1)点击提交按钮两次。 (2)点击刷新按钮。 (3)使用浏览器后退按钮重复之前的操作,导致重复...
  • 我们平时开发免不了要提交form但是每次页面刷新都会提交一次form这让人很头痛 下面就分享一个简单的解决方法 import java.util.Random; import javax.servlet.http.HttpServletRequest; import javax.servlet...
  • 以前在做居民信息管理系统时出现过一个非常严重的问题,在添加居民信息,每刷新一次就会数据库中就会重复提交一次。这个问题很让人头疼,正好最近有一次面试,也被提问到此问题了,故在网上搜了一些这方面的文章。供...
  • form表单重复提交

    2016-01-26 21:25:44
     后台完成数据库操作后返回到页面,这时点击浏览器的后退再提交或刷新页面,会导致form表单重复提交 原因:  第一次提交的表单会被缓存到内存中,直到页面下次提交或页面关闭或转向其它页面才消失,在自调用返回...
  • 重复提交是我们开发中会常碰到的一个问题,除了我们使用js来防止表单重复提交,同时还可以使用php来防止重复提交哦。/** php中如何防止表单重复提交*/session_start();if (empty($_SESSION['ip'])) {//第一次...
  • 为什么要避免form表单重复提交呢?因为我们不想让我们的服务器重复处理没必要的数据,同时我们也是避免我们的数据库产生重复的数据,避免表单重复提交也是让我们的网站更安全的一种表现。 先看一下有哪些情况下回...
  • Struts2防止form表单重复提交 原理: 1.struts2环境 2.拦截器: 在struts-default.xml可以找到这两个拦截器 返回结果invalid.token --> /message.jsp   案例: jsp页面: ...
  • 有时候我们会遇到form表单重复提交的问题,例如双击提交,或者是刷新浏览器。这种时候就会出现form被重复提交的情况。那么我根据我所知道的情况对liferay防止表单重复提交进行一下总结: 1. 在liferay-portlet...
  • 如题,我在用form表单提交时,第一次成功提交。但我刷新页面的时候会提交第二次,也就是重复了,再刷新还会再次提交。后台是post请求,请问有什么办法可以防止重复提交? 这是我的代码: [img=...
  • 表单重复提交是在多用户web应用中最常见的、带来很多麻烦的一个问题,有很多的应用场景都会遇到重复提交问题,比如: 点击提交按钮两次。 点击刷新按钮。 使用浏览器后退按钮重复之前的操作,导致重复提交表单。 ...
  • Struts2防止表单刷新重复提交

    千次阅读 2014-06-15 11:52:31
    防止表单重复提交主要用的到标签是,拦截器 interceptor-ref name="token" />,还有一个默认的返回值result name="invalid.token">/input.jspresult>  在页面加载时,产生一个GUID(Globally Unique ...
  • 写在前面:学习JAVA WEB,在提交新增表单后F5,form表单会不停的提交,困扰了我很久,也试过网上很多方法,可能是我使用方法不对,一直不成功。 其中代码为: int result = sf.add(stuno, pwd, stuname, stusex...
  • 因为下载Excel或者csv必须得是form表单,而用form表单要实现禁止重复提交就如下所示,关于主体部分我这边就没写了,具体的导出按钮就可以如下代码所写。 <form action="/download/" method="post" onsubmit=...
  • 比如下面的情况就会导致表单重复提交: 点击提交按钮两次。 点击刷新按钮。 使用浏览器后退按钮重复之前的操作,导致重复提交表单。 使用浏览器历史记录重复提交表单。 浏览器重复的HTTP请求。 网页被恶意刷新
  • 论银行支付接口与防止刷新重复提交表单之间的提示关系
  • FORM表单重复提交问题解决方法

    千次阅读 2015-04-16 15:23:46
    我之前遇到过,就是在提交完之后若不跳到另一个页面,表单的提交信息会保存在缓存中,一单再次点击sumit,或者F5刷新页面,又或者后退前进,都会触发表单信息在再次提交,这就是所说的重复提交Form表单信息,解决...
  • form表单提交后返回query页面会显示com.code="...然后在返回页面刷新会导致重复提交数据。   解决方法:通过ajaxSubmit提交用 window.location.href =“”query.htm”页面   设置浏览器兼容 &l...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,883
精华内容 5,953
关键字:

form表单刷新重复提交