原理:
servlet頁面代碼:
1.每次請求時產生一個token(一般為時間戳記),存於session中並隨之用hidden提交,在servlet中判斷接收到的token和session中的是否一致來判斷是否重複提交,如果不是則重新產生一個 token存於session中覆蓋原來的token。
2.當使用者返回或者重新整理重複請求servlet時,servlet判斷token是否一致,由於請求方沒有產生新的token,所以和servlet新產生的token不一致,認為重複提交。
3.當使用者在請求頁面重新整理也就是重新在請求頁面產生token,這時新的token覆蓋servlet產生的token,這時token一致,認為是一個新的請求。
JSP頁面代碼
<body> <% long token=System.currentTimeMillis(); //產生時間戳記的token session.setAttribute("token",token); %> <form action="isRepeat" method="post"> <input type="text" name="username"/> <input type="text" name="password"/> <input type="hidden" value="<%=token %>" name="token"/> <!-- 作為hidden提交 --> <input type="submit" value="提交"/> </form></body>
介面代碼:
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); resp.setContentType("text/html,charset=utf-8"); String username=req.getParameter("username"); String password=req.getParameter("password"); long token=Long.parseLong(req.getParameter("token")); long tokenInSession=Long.parseLong(req.getSession().getAttribute("token")+""); if(token==tokenInSession){ resp.getWriter().println("ok "); //如果是第一次請求,則產生新的token req.getSession().setAttribute("token", System.currentTimeMillis()); } else { resp.getWriter().println("do not repeat submit"); } }