一、前台验证
1.首先在from表单加一个隐藏域字段,设值为true。例如: <input type="hideen" name="tokenFlag" id="tokenFlag" value="true"/> 2.在js中表单提交的验证方法中加判断,如下: var flag=$("#tokenFlag").val(); if(flag=="true"){ $("#tokenFlag").val('false'); //业务代码(验证、跳转) }
二、session防止表单重新提交
具体的做法:在服务器端生成一个唯一的随机标识号,专业术语称为Token(令牌),同时在当前用户的Session域中保存这个Token。然后将Token发送到客户端的Form表单中,在Form表单中使用隐藏域来存储这个Token,表单提交的时候连同这个Token一起提交到服务器端,然后在服务器端判断客户端提交上来的Token与服务器端生成的Token是否一致,如果不一致,那就是重复提交了,此时服务器端就可以不处理重复提交的表单。如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。
在下列情况下,服务器程序将拒绝处理用户提交的表单请求:
- 存储Session域中的Token(令牌)与表单提交的Token(令牌)不同。
- 当前用户的Session中不存在Token(令牌)。
- 用户提交的表单数据中没有Token(令牌)。
看具体的范例:
1.创建FormServlet,用于生成Token(令牌)和跳转到form.jsp页面
1 package xdp.gacl.session; 2 3 import java.io.IOException; 4 import javax.servlet.ServletException; 5 import javax.servlet.http.HttpServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 9 public class FormServlet extends HttpServlet { 10 private static final long serialVersionUID = -884689940866074733L; 11 12 public void doGet(HttpServletRequest request, HttpServletResponse response) 13 throws ServletException, IOException { 14 15 String token = TokenProccessor.getInstance().makeToken();//创建令牌 16 System.out.println("在FormServlet中生成的token:"+token); 17 request.getSession().setAttribute("token", token); //在服务器使用session保存token(令牌) 18 request.getRequestDispatcher("/form.jsp").forward(request, response);//跳转到form.jsp页面 19 } 20 21 public void doPost(HttpServletRequest request, HttpServletResponse response) 22 throws ServletException, IOException { 23 doGet(request, response); 24 } 25 26 }