防止表單重複提交的幾種方式。。。這個面試應該都被問到過吧。。

7 varisCommitted =false;//表單是否已經提交標識,默認為false8 functiondosubmit(){9 if(isCommitted==false){10 isCommitted =true;//提交表單後,將表單是否已經提交標識設置為true11 returntrue;//返回true讓表單正常提交12 }else{13 returnfalse;//返回false那麼表單將不提交14 }15 }16 17 18 19 20 10 11 ">13 --%>14 15

16 用戶名:17 18 19
20

3.DoFormServlet處理表單提交

1packagexdp.gacl.session;23importjava.io.IOException;4importjavax.servlet.ServletException;5importjavax.servlet.http.HttpServlet;6importjavax.servlet.http.HttpServletRequest;7importjavax.servlet.http.HttpServletResponse;89publicclassDoFormServletextendsHttpServlet{1011 publicvoiddoGet(HttpServletRequest request, HttpServletResponse response)12 throwsServletException, IOException{1314 booleanb = isRepeatSubmit(request);//判斷用戶是否是重複提交15 if(b==true){16 System.out.println("請不要重複提交");17 return;18 }19 request.getSession().removeAttribute("token");//移除session中的token20 System.out.println("處理用戶提交請求!!");21 }22 23 /**24 * 判斷客戶端提交上來的令牌和服務器端生成的令牌是否一致25 *@paramrequest26 *@return27 * true 用戶重複提交了表單28 * false 用戶沒有重複提交表單29 */30 privatebooleanisRepeatSubmit(HttpServletRequest request){31 String client_token = request.getParameter("token");32 //1、如果用戶提交的表單數據中沒有token,則用戶是重複提交了表單33 if(client_token==null){34 returntrue;35 }36 //取出存儲在Session中的token37 String server_token = (String) request.getSession().getAttribute("token");38 //2、如果當前用戶的Session中不存在Token(令牌),則用戶是重複提交了表單39 if(server_token==null){40 returntrue;41 }42 //3、存儲在Session中的Token(令牌)與表單提交的Token(令牌)不同,則用戶是重複提交了表單43 if(!client_token.equals(server_token)){44 returntrue;45 }46 47 returnfalse;48 }4950 publicvoiddoPost(HttpServletRequest request, HttpServletResponse response)51 throwsServletException, IOException{52 doGet(request, response);53 }54
55}

生成Token的工具類TokenProccessor

1packagexdp.gacl.session;23importjava.security.MessageDigest;4importjava.security.NoSuchAlgorithmException;5importjava.util.Random;6importsun.misc.BASE64Encoder;78publicclassTokenProccessor{910 /*11 *單例設計模式(保證類的對象在內存中只有一個)12 *1、把類的構造函數私有13 *2、自己創建一個類的對象14 *3、對外提供一個公共的方法,返回類的對象15 */16 privateTokenProccessor(){}17 18 privatestaticfinalTokenProccessor instance =newTokenProccessor();19 20 /**21 * 返回類的對象22 *@return23 */24 publicstaticTokenProccessorgetInstance(){25 returninstance;26 }27 28 /**29 * 生成Token30 * Token:Nv6RRuGEVvmGjB+jimI/gw==31 *@return32 */33 publicStringmakeToken(){ //checkException34 // 7346734837483 834u938493493849384 4343438435 String token = (System.currentTimeMillis() +newRandom().nextInt(999999999)) +"";36 //數據指紋 128位長 16個字節 md537 try{38 MessageDigest md = MessageDigest.getInstance("md5");39 bytemd5[] = md.digest(token.getBytes());40 //base64編碼--任意二進制編碼明文字符 adfsdfsdfsf41 BASE64Encoder encoder =newBASE64Encoder();42 returnencoder.encode(md5);43 }catch(NoSuchAlgorithmException e) {44 thrownewRuntimeException(e);45 }46 }
47}

首先訪問FormServlet,在FormServlet中生成Token之後再重定向到form.jsp頁面,這次是在服務器端處理表單重複提交的,運行效果如下:

防止表單重複提交的幾種方式。。。這個面試應該都被問到過吧。。

從運行效果中可以看到,通過這種方式處理表單重複提交,可以解決上述的場景二和場景三中出現的表單重複提交問題。


分享到:


相關文章: