防止表单重复提交最好的方式就是使用PRG模式
用户已Post方式提交数据,Servlet以重定向的方式将用户重定向到另一个访问资源上,以Get的方式请求最终的资源。
使用Token机制处理表单重复提交
附Struts2的token介绍:http://www.cnblogs.com/shininguang/p/4922880.html
1、接收客户GET请求,产生Token,并放在Session和request中各一份
2、在表单中接收token
3、用户提交表单
4、处理表单请求前验证Token是否和Session中一直,如果不一致则视为重复提交,当成功提交后,将Session中的Token销毁。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/ 使用UUID作为token的值 /
String token = UUID.randomUUID().toString();
/ 当发生请求的时候在请求的页面里传入一个token /
request.setAttribute("token", token);
/ 将Session中的token也存一份*/
HttpSession session = request.getSession();
session.setAttribute("sessiontoken", token);
/ 当用户通过get方式访问token的时候,使用请求转发的方式重定向到token.jsp /
request.getRequestDispatcher("/WEB-INF/views/token/token.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/ 从请求的页面获得token /
String token = (String) request.getParameter("token");
/ 获得金额 /
String money = (String) request.getParameter("money");
request.setAttribute("money", money);
/ 获得sessiontoken /
HttpSession session = request.getSession();
String sessiontoken = (String) session.getAttribute("sessiontoken");
if(session != null && token.equals(sessiontoken)) {
/ 操作成功后将session中的token属性移除 /
session.removeAttribute("sessiontoken");
request.getRequestDispatcher("/WEB-INF/views/token/tokensuccess.jsp").forward(request, response);
} else {
/ 重复提交跳转到repeat页面 /
request.getRequestDispatcher("/WEB-INF/views/token/tokenrepeat.jsp").forward(request, response);
}
}