表单重复提交的常见情况及解决方法

292 阅读2分钟

情况1

提交完表单。服务器使用请求转发来进行页面跳转,这个时候,用户按下了功能键F5,就会发起最后一次的请求。造成表单重复提交问题。

解决方法:使用重定向来进行跳转。

将请求转发改为请求重定向即可

情况2

用户正常提交服务器,但是由于网络延迟等原因,迟迟未收到服务器的响应,这个时候,用户以为提交失败,也许会着急,多点了几次提交操作,也会造成表单重复提交。

情况3

用户正常提交服务器。服务器也没有延迟,但是提交完成后,用户回退浏览器。重新提交,也会造成表单重复提交的问题。

情况2和情况3的问题都可以利用验证码来解决拿情况3来说,即使提交完成后,用户回退,但之前的token(验证码)已经被删除了,回退后是无意义的提交

图片.png

谷歌验证码kaptcha图片验证码的使用

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

2、在web.xml文件去配置用于验证码的Servlet程序

找到这个文件的全类名,去web.xml文件中配置

图片.png

配置为如下

当你访问这个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>

如果访问当前servlet出现一张验证码的图片,说明配置完成了

图片.png

3、在表单中使用img标签显示验证码图片并使用它

这里我使用了Base标签,读者可以按自己的情况而定(路径)

<img alt="验证码图片" src="kaptcha.jpg" style="float: right; margin-right: 40px">

4、用验证码与客户端的表单内容进行比较,判断是否提交成功

找到这个位置

图片.png

找到KAPTCHA_SESSION_KEY:这个是验证码的常量值

图片.png

//        code是验证码
        String code = request.getParameter("code");
//        获取Session中的验证码
        String token = (String) request.getSession().getAttribute(KAPTCHA_SESSION_KEY);
//        删除之前的验证码,不让它再重复使用第二次
        request.getSession().removeAttribute(KAPTCHA_SESSION_KEY);
// 如果验证码不为空,且验证码与生成的验证码一致(此处忽略大小写)
if (code != null && code.equalsIgnoreCase(token)) {
    // 要执行的操作
}