问题一:提交完表单。服务器使用请求转来进行页面跳转。这个时候,用户按下功能键 F5,就会发起浏览器之前的最后一次的请求。 造成表单重复提交问题。
//错误示范
public class RegistServlet extends HttpServlet {
UserService userService = new UserServiceImpl();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
...
userService.saveUser(new User(...));
// 不改变浏览器地址栏,会造成重复提交表单
request.getRequestDispatcher("/ok.jsp").forward(request,response);
}
}
根本原因:请求转发不会改变浏览器的url地址,用户在使用get方法进行提交时,浏览器的地址、参数都不会发生改变,每次使用刷新相当于我们重新进行了一次提交,也就导致了多次进行注册的问题。
**解决方法:使用重定向进行页面的跳转。**重定向之后刷新页面是对ok.jsp页面进行访问,故而不会在进行表单的提交。
public class RegistServlet extends HttpServlet {
UserService userService = new UserServiceImpl();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
...
userService.saveUser(new User(...));
response.sendRedirect(request.getContextPath() + "/ok.jsp");
}
}
问题二:用户正常提交服务器,但是由于网络延迟等原因,迟迟未收到服务器的响应,这个时候,用户以为提交失败, 就会着急,然后多点了几次提交操作,也会造成表单重复提交。
问题三:用户正常提交服务器。服务器也没有延迟,但是提交完成后,用户回退浏览器。重新提交。也会造成表单重复提交。
问题二和问题三解决办法:使用验证码进行验证。请看—>谷歌验证码的使用讲解