Form表单重复提交问题解决方法
2017-07-10 00:00
851 查看
在开发中,如果一个新增或修改的表单,在后台完成数据库操作后我们设定的不是跳转到其他页面,而是请求重定向返回本页面,这时点击浏览器的后退再提交或刷新页面,会导致form表单重复提交,即这条记录会被增加或修改两次。
解决方法二:用JS的方式 —— 提交表单后提交按钮变灰/隐藏提交按钮
解决方法三:用令牌的方式
①在Servlet中,toStart重定向逻辑中,产生token,可以使用java.util包下的UUID.randomUUID( ),或者MD5加密生成,或者Base64Util加密,都可以!
②将生成的token字符串,放入session中。
③在withdraw.jsp 等页面表单中,设置一个input标签,并设置type=“hidden”,作为一个隐藏域,value=${token}
④回到对应表单提交的 Servlet 逻辑判断语句中,获取session中的token,和表单隐藏域中的getParameter的token,对这2个token的值进行判断。如果 !=null且相等,则执行相应业务操作
⑤token验证成功,且业务完成后,删除session中token
PS:在这过程中,session只能用一次
示例代码如下:
前端jsp页面:
后端Servlet:
导致表单重复提交的原因:
第一次提交的表单会被缓存到内存中,直到页面下次提交或页面关闭或转向其他页面时才消失。在自调用返回时,内存中的数据依然在,这时页面中的判断提交的代码依然可以检测到提交的值,因而会产生重复提交的效果。解决方法:
解决方法一:用重定向的方式 √解决方法二:用JS的方式 —— 提交表单后提交按钮变灰/隐藏提交按钮
<script type="text/javascript"> function check(){ document.getElementById("submit").disabled=true; return true; } </script>
解决方法三:用令牌的方式
①在Servlet中,toStart重定向逻辑中,产生token,可以使用java.util包下的UUID.randomUUID( ),或者MD5加密生成,或者Base64Util加密,都可以!
②将生成的token字符串,放入session中。
③在withdraw.jsp 等页面表单中,设置一个input标签,并设置type=“hidden”,作为一个隐藏域,value=${token}
④回到对应表单提交的 Servlet 逻辑判断语句中,获取session中的token,和表单隐藏域中的getParameter的token,对这2个token的值进行判断。如果 !=null且相等,则执行相应业务操作
⑤token验证成功,且业务完成后,删除session中token
PS:在这过程中,session只能用一次
示例代码如下:
前端jsp页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>query</title>
<script type="text/javascript"> function check(){ document.getElementById("submit").disabled=true; return true; } </script>
</head>
<body>
<%=session.getAttribute("username")%>您好,您当前卡余额为<%=request.getAttribute("price")%>元
<form action="QukuanServlet?method=qukuan" method="POST" onsubmit="return check();">
<input name="token" type="hidden" value="${token }"/>
取款金额:<input name="price" type="text" />
<br/>
<input id="submit" type="submit" value="提交">
</form>
</body>
</html>
后端Servlet:
import java.io.IOException; import java.util.Random; import java.util.UUID; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.dayuan.util.MD5Util; /** * Servlet implementation class QueryPriceServlet */ @WebServlet("/QukuanServlet") public class QukuanServlet extends HttpServlet { /** * */ private static final long serialVersionUID = -4086427793187085793L; /** * @see HttpServlet#HttpServlet() */ public QukuanServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse * response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String method = request.getParameter("method"); String price = request.getParameter("price"); HttpSession session = request.getSession(); if (method == null || method.equals("")) { request.getRequestDispatcher("WEB-INF/jsp/main.jsp").forward( request, response); } else if (method.equals("toStart")) { // 创建令牌 String token = UUID.randomUUID().toString(); session.setAttribute("token", token); request.getRequestDispatcher("WEB-INF/jsp/qukuan.jsp").forward( request, response); } else if (method.equals("qukuan")) { String token1 = request.getParameter("token"); String token2 = String.valueOf(session.getAttribute("token")); if (!(token1 != null && token1.equals(token2))) { session.setAttribute("msg", "取款失败,请求不合法"); // 取款失败跳转到信息提示页面 request.getRequestDispatcher("WEB-INF/jsp/msg.jsp") .forward(request, response); return; } // 取款逻辑 System.out.println("取款操作。。。扣款:" + price + "元"); session.setAttribute("msg", "取款成功!"); session.removeAttribute("token"); // 取款成功跳转到取款页面 request.getRequestDispatcher("QukuanServlet?method=toStart") .forward(request, response); // response.sendRedirect("QukuanServlet?method=toStart"); } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
相关文章推荐
- FORM表单重复提交问题解决方法
- FORM表单重复提交问题解决方法
- IE 下Enter提交表单存在重复提交问题的解决方法
- 常见表单重复提交问题整理及解决方法
- php 解决和避免form表单重复提交的方法
- php 解决和避免form表单重复提交的方法
- php 解决和避免form表单重复提交的方法
- php 解决和避免form表单重复提交的方法
- php 解决和避免form表单重复提交的方法
- Chrome Form多次提交表单问题的解决方法
- easyui关于解决tab添加的页面通过href加载数据内容的页面刷新后form表单重复提交的问题;
- php 解决和避免form表单重复提交的方法
- 表单包含file上传文件提交,使用ajaxSubmint或者ajaxForm 遇到的问题以及解决方法
- 解决Form表单重复提交问题
- 解决form表单重复提交以及多页面提交问题
- 常见表单重复提交问题整理及解决方法
- php 解决和避免form表单重复提交的方法
- JSP入门之避免Form表单重复提交的解决方法
- 常见表单重复提交问题整理及解决方法-点击链接加入群【农产品一体化解决方案】:https://jq.qq.com/?_wv=1027&k=49BAOCe