情况1
提交完表单。服务器使用请求转发来进行页面跳转,这个时候,用户按下了功能键F5,就会发起最后一次的请求。造成表单重复提交问题。
解决方法:使用重定向来进行跳转。
将请求转发改为请求重定向即可
情况2
用户正常提交服务器,但是由于网络延迟等原因,迟迟未收到服务器的响应,这个时候,用户以为提交失败,也许会着急,多点了几次提交操作,也会造成表单重复提交。
情况3
用户正常提交服务器。服务器也没有延迟,但是提交完成后,用户回退浏览器。重新提交,也会造成表单重复提交的问题。
情况2和情况3的问题都可以利用验证码来解决,拿情况3来说,即使提交完成后,用户回退,但之前的token(验证码)已经被删除了,回退后是无意义的提交
谷歌验证码kaptcha图片验证码的使用
1、导入谷歌验证码的jar包:kaptcha-2.3.2.jar
2、在web.xml文件去配置用于验证码的Servlet程序
找到这个文件的全类名,去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>
如果访问当前servlet出现一张验证码的图片,说明配置完成了
3、在表单中使用img标签显示验证码图片并使用它
这里我使用了Base标签,读者可以按自己的情况而定(路径)
<img alt="验证码图片" src="kaptcha.jpg" style="float: right; margin-right: 40px">
4、用验证码与客户端的表单内容进行比较,判断是否提交成功
找到这个位置
找到KAPTCHA_SESSION_KEY:这个是验证码的常量值
// 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)) {
// 要执行的操作
}