防止表單重複提交&刷新

表單重複提交


方法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中

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章