(一)表单重复提交的三种情况
一:提交完表单。服务器使用请求转来进行页面跳转。这个时候,用户按下功能键 F5,就会发起最后一次的请求。
造成表单重复提交问题。解决方法:使用重定向来进行跳转
二:用户正常提交服务器,但是由于网络延迟等原因,迟迟未收到服务器的响应,这个时候,用户以为提交失败,就会着急,然后多点了几次提交操作,也会造成表单重复提交。
三:用户正常提交服务器。服务器也没有延迟,但是提交完成后,用户回退浏览器。重新提交。也会造成表单重复提交。
针对第二三种表单重复提交,解决办法是使用验证码进行解决。
实现代码:
在userServlet程序中,有regist方法
protected void regist(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
//1、获取session中的验证码
String token=(String) req.getSession().getAttribute(KAPTCHA_SESSION_KEY);
//2、删除session中的验证码
req.getSession().removeAttribute(KAPTCHA_SESSION_KEY);
String username=req.getParameter("username");
String password=req.getParameter("password");
String email=req.getParameter("email");
String code=req.getParameter("code");
//首先看验证码是否正确
if(token!=null&&token.equalsIgnoreCase(code)){
if(userService.existsUsername(username)){
System.out.println("用户名已经存在");
req.setAttribute("msg","用户名已经存在");
req.setAttribute("username",username);
req.setAttribute("email",email);
req.getRequestDispatcher("/pages/user/regist.jsp").forward(req,resp);
}else{
userService.registUser(new User(null,username,password,email));
req.getRequestDispatcher("/pages/user/regist_success.jsp").forward(req,resp);
}
}
else{
req.setAttribute("msg","验证码错误");
req.setAttribute("username",username);
req.setAttribute("email",email);
System.out.println("验证码错误");
req.getRequestDispatcher("/pages/user/regist.jsp").forward(req,resp);
}
}
(二)验证码的相关知识
2.1验证码的切换
这里注意,如果不加newDate这个代码,他再火狐浏览器中会有缓存,这样点击第二次就无法切换了
// 给验证码的图片,绑定单击事件
$("#code_img").click(function () {
// 在事件响应的 function 函数中有一个 this 对象。这个 this 对象,是当前正在响应事件的 dom 对象
// src 属性表示验证码 img 标签的 图片路径。它可读,可写
// alert(this.src);
this.src = "${basePath}kaptcha.jpg?d=" + new Date();
});