防止表单重复提交&刷新

时间:2020-12-19 17:01:02

表单重复提交


方法1:

  <script type="text/javascript"> var iscommitted=false; function dosubmit(){ if(!iscommitted){ iscommitted=true; document.getElementById("tbn").disabled="disabled"; return true; }else{ return false; } } </script>

<form action="/day07/servlet/doFormServlet" method="post" onsubmit="return dosubmit()">
用户名:<input type="text" name="username"/>
    <input id="btn" type="submit" value="提交"/>
</form>

方法二

 <script type="text/javascript"> var iscommitted=false; function dosubmit(){ if(!iscommitted){ iscommitted=true; document.getElementById("tbn").disabled="disabled"; return true; }else{ return false; } } </script>

    <form action="/day07/servlet/doFormServlet" method="post" onsubmit="return dosubmit()">
      用户名:<input type="text" name="username"/>
      <input id="btn" type="submit" value="提交"/>
      <input name="token" type="hidden" value="${token}"/>
    </form>

刷新重复提交

方法1:重定向解决
这是shuaxin.jsp

<script src="./js/jquery-1.8.2.min.js" type="text/javascript"></script>
<script type="text/javascript"> function shua(){ var id=$("#id").val(); location.href="<%=request.getContextPath()%>/personServlet?method=add&id="+id; } </script>
</head>
<body>
<input type="text" name="id" id="id">
<button onclick="shua()">点我呀</button>
</body>

这是personServlet 用response.sendRedirect
跳转会改变地址所以可以防止

private void add(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
// TODO Auto-generated method stub
String id = request.getParameter("id");
List list = (List)request.getSession().getAttribute("list");
if(list==null){
    list=new ArrayList<String>(); 
    request.getSession().setAttribute("list", list);
}
list.add(id);
request.setAttribute("aa", "你大爷");//得不到因为用的是重定向只能转发session的数据
//防止刷新再次提交id;因为转发地址不变http://localhost:8080/test_serialize/personServlet?method=add&id=2
response.sendRedirect("/test_serialize/bianli.jsp");
//request.getRequestDispatcher("/bianli.jsp").forward(request, response);

    }

这是bianli.jsp

<body>
<c:forEach items="${list }" var="l">
<p>${l}</p>
</c:forEach>
${aa }
//这里的aa得不到因为重定向后就无法得到request域中的值只能遍历session的值
</body>

方法二:session解决
先在shuaxin.jsp给session设值

<% session.setAttribute("type", "new"); %>

<input type="text" name="id" id="id">
<button onclick="shua()">点我呀</button>

然后在servlet里取值判断,转发到bianli.jsp的时候remove掉sessiontype的值

String type =(String) request.getSession().getAttribute("type");
if(type==null){
request.getRequestDispatcher("/bianli.jsp").forward(request, response);
}else{

String id = request.getParameter("id");
List list = (List)request.getSession().getAttribute("list");
if(list==null){
    list=new ArrayList<String>(); 
    request.getSession().setAttribute("list", list);
}
list.add(id);
request.getSession().removeAttribute("type");
request.getRequestDispatcher("/bianli.jsp").forward(request, response);
}

最后转发到bianli.jsp中

因为bianli.jsp没有给session赋值所以传到servlet中session为空那么就直接跳转到bianli.jsp中