JavaWeb 如何防止表单重复提交 - 使用Token,令牌
生活随笔
收集整理的這篇文章主要介紹了
JavaWeb 如何防止表单重复提交 - 使用Token,令牌
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
JavaWeb 如何防止表單重復提交 - 使用Token,令牌
說到重復提交 ,應該想到兩種場景:
1. 在下單,或者支付 這種情況 那么不允許 ?刷新,不允許后退再點擊提交(后退之后提交會失敗,修改了也不行)。
2. 在填寫表單之后,提交完成之后,不允許 刷新,但是允許 返回之后 提交,給用戶修改表單的機會。
解決方法
首先可以防止用戶刷新,處理完成之后用Redirect的方式 跳轉到success頁面,這樣刷新則沒有用。但是返回的時候還可以提交一次緩存的數據。 ? 然后 使用令牌,在頁面表單生成一個token, 這是在請求頁面的時候產生的,放在隱藏域之中。然后把token存在session中。 提交之后,判斷這兩個token是否一樣,是一樣則通過,并且清除session 中的 token,這樣就能防止返回之后再次提交,因為返回的時候點擊提交讀取的是緩存,但是session已經沒有這個token了。這適用于場景1 ? 對于場景2,直接禁止緩存,那么返回的時候一定重新請求 表單,用戶可以再次填寫。在用token的情況下,session中的 token總是和 隱藏域中的一致。 ? 在使用令牌的情況下,如果用戶沒有重新請求表單,并且惡意提交之前的Post數據,則在服務器端,session里面的token已經被清空且沒有重新請求,則session的token為空不能通過。 <body><%long token=System.currentTimeMillis(); //產生時間戳的tokensession.setAttribute("token",token); %><form action="isRepeat" method="post"><input type="text" name="username"/><input type="text" name="password"/><input type="hidden" value="<%=token %>" name="Reqtoken"/> <!-- 作為hidden提交 --><input type="submit" value="提交"/></form> </body>String token = req.getParameter("Reqtoken");// 獲取表單上面的時間戳T1HttpSession session=req.getSession();String tokenInSession = ""+session.getAttribute("token");System.out.println("Session in Token: " + tokenInSession);System.out.println("表單的Token:" + token+"\n------------");if (tokenInSession!=null && token!=null && token.equals(tokenInSession)) { resp.getWriter().println("ok ");session.removeAttribute("token");} else { //如果禁止緩存,返回會 重新請求,tokenInSession 是不會為空的System.out.println("重復提交,或者有錯誤");//或者有錯誤,直接訪問servlet等resp.sendRedirect("index.jsp");return;}resp.sendRedirect("success.jsp"); //此句子導致刷新無效
禁止緩存的方法,參見另一篇文章。 另一種方法: 該方法原理是 記住上一次提交的 頁面token。將本次的token和上次比對,如果一樣說明重復提交。該方法不需要禁用緩存。 String token = req.getParameter("Reqtoken");// 獲取表單上面的時間戳HttpSession session=req.getSession();String LasttokenInSession = (String) session.getAttribute("Lasttoken");//System.out.println("------------\nToken in Session: " + tokenInSession);System.out.println("表單的Token:" + token);System.out.println("上一次表單的Token:" + LasttokenInSession);//token!=null 是防止用戶直接打開本servlet頁面。LasttokenInSession是空,說明是第一次提交 ,和上一次不想等則說明不是重復提交if(token!=null && (LasttokenInSession ==null || !LasttokenInSession.equals(token)) ) {session.removeAttribute("token");//Token 清空session.setAttribute("Lasttoken",token);// 保存上一次}else { resp.getWriter().println("<h1>表單頁面無效,請返回并且刷新頁面</h1>");resp.getWriter().println("<h1><a href=\""+ "index.jsp" +"\">返回并刷新</a></h1>");resp.getWriter().println("Do not Duplicate submit!");return;}resp.sendRedirect("success.jsp"); //此句子導致刷新無效
?
轉載于:https://www.cnblogs.com/slankka/p/9158541.html
總結
以上是生活随笔為你收集整理的JavaWeb 如何防止表单重复提交 - 使用Token,令牌的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LoadRunner11 压力测试
- 下一篇: 绿盾加密导致Visual Stdio无法