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

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

表单重复提交问题——验证码_第1张图片

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

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

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

    
        KaptchaServlet
        com.google.code.kaptcha.servlet.KaptchaServlet
    
    
        KaptchaServlet
        /kaptcha.jpg
    

案例代码:

register.jsp:

    表单注册——验证码

  
  
    
username:
code: 验证码生成有误。
ok.jsp:

恭喜你,登录成功。

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("请不要重复提交表单项。");

        }

    }

验证结果:

表单重复提交问题——验证码_第2张图片

表单重复提交问题——验证码_第3张图片

你可能感兴趣的:(JavaWeb)