表单重复提交问题——验证码

表单重复提交常见的三种情况:
    一:提交完表单之后服务器使用请求转发来进行页面跳转。
        这个时候,用户按下功能键F5,就会发起最后一次请求。造成表单重复提交问题。
        解决方法:使用重定向来进行跳转。
    二:用户正常提交服务器,但是由于网络延迟等原因,迟迟未收到服务器的响应,
        这个时候,用户以为提交失败,然后多次点击提交按钮,也会造成表单重复提交(可使用Thread.sleep();来模拟)
    三:用户正常提交服务器,服务器也没有延迟,但是提交完成后,用户退回浏览器,重新提交。
        也会造成表单重复提交。
        (二、三解决方法:使用验证码)

谷歌验证码kaptcha使用步骤如下:

1.导入谷歌验证码jar包:kaptcha-2.3.2.jar

2.在web.xml中配置生成验证码的Servlet程序

    <servlet>
        <servlet-name>KaptchaServlet</servlet-name>
        <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>KaptchaServlet</servlet-name>
        <url-pattern>/kaptcha.jpg</url-pattern>
    </servlet-mapping>

案例代码:

register.jsp:
<head>
    <title>表单注册——验证码</title>
<script type="text/javascript">
      $(function () {
        //验证码刷新,(给验证码的图片绑定单击事件)
        $("#code_img").click(function () {
          /**
           * 在响应事件的function函数中有一个this对象。这个this对象就是当前正在响应事件的dom对象
           * src属性表示验证码img标签的图片路径,它可读、可写
           * 	因为验证码切换的时候它每次请求的访问路径都是相同的,
           * 	因此浏览器为了提高效率就会将请求地址放在缓存中,因此当再次发起请求的时候,
           * 	导致得到的验证码是同一个,因此需要加上一个参数使每次访问的路径都不相同
           * 	 new Date() :获取时间戳,每次得到的时间都不相同,这个时候就会使每次的请求访问路径都不相同
           * @type {string}
           */
          this.src = "${basePath}kaptcha.jpg?d=" + new Date();
        });
      });
    </script>
  </head>
  <body>
    <form action="registerServlet" method="post">
      username:<input type="text" name="username" /><br/>
      code:<input type="text" name="code" style="width: 60px" />
      <img src="kaptcha.jpg" alt="验证码生成有误。" style="width: 130px; height: 50px;" /><br/>

      <input type="submit" value="注册">
    </form>
  </body>
ok.jsp:
<h1>恭喜你,登录成功。</h1>
RegisterServlet:
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        1、获取Session中的验证码(KAPTCHA_SESSION_KEY:kaptcha-2.3.2.jar包中Constants中)
        String token = (String) request.getSession().getAttribute(KAPTCHA_SESSION_KEY);
//        2、删除Session中的验证码(避免重复使用)
        request.getSession().removeAttribute(KAPTCHA_SESSION_KEY);

//        3、获取表单项信息
        String username = request.getParameter("username");
        String code = request.getParameter("code");

        if (token != null && token.equalsIgnoreCase(code)) {
            System.out.println("保存数据到数据库:" + username);
            response.sendRedirect(request.getContextPath() + "/ok.jsp");
        } else {
            System.out.println("请不要重复提交表单项。");

        }

    }

验证结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值