以下情况会出现表单重复提交
- 用户提交表单,提交完成后,使用功能键F5,会出现重复提交
- 用户在提交表单时,出现网络延迟的问题,而用户以为是卡了,多次点击提交按钮,导致表单重复提交
- 用户提交完表单之后,后退页面,再点击提交,会重复提交
第一种情况,我们一般使用重定向的方式可以解决。
后两种情况,我们则使用验证码来解决。
验证码如何阻止提交?
- 从session中获取验证码信息(假设是abcde)
- 立刻销毁session
- 将用户输入的验证码与获取的验证码信息做对比
只要我们销毁了session中的信息,之后无论用户重复上面两种操作,都没办法通过验证码的校验
代码实现
添加谷歌验证码jat包(kaptcha.jar)
在web.xml文件中配置KaptchaServlet
KaptchaServlet程序会在前端显示验证码信息,并通过session将图片显示的文字穿给服务器
<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>
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取用户输入的验证码
String code = req.getParameter("code");
//获取动态生成的验证码
String verificationCode = (String) req.getSession().getAttribute(KAPTCHA_SESSION_KEY);
//马上销毁session
req.getSession().invalidate();
if (attribute!=null && attribute.equals(code)){
System.out.println("登录成功");
}else {
System.out.println("登录失败");
}
}
}