JavaWeb_session_應用_防止註冊表單頁面的重複提交

[java] view plaincopy
  1. /* 
  2.  * 防止表單註冊頁面的重複提交 
  3.  *  
  4.  * 在該頁面上產生一個令牌值 
  5.  * 該令牌值一個添加至服務器的session屬性中,另一個隨傳遞至瀏覽器頁面中,通過比對2個令牌值是否相等,來判斷是否處理相應請求。 
  6.  * 註冊成功後,刪除在服務器中的令牌值,由於已經找不到令牌值而防止了表單的重複提交! 
  7.  *  
  8.  * Register.java 
  9.  * http://blog.csdn.net/strawberry2013  
  10.  * 2013-6-13 
  11.  */  
  12. package com.baidu;  
  13.   
  14. import java.io.IOException;  
  15. import java.security.MessageDigest;  
  16. import java.security.NoSuchAlgorithmException;  
  17. import java.util.Random;  
  18.   
  19. import javax.servlet.ServletException;  
  20. import javax.servlet.http.HttpServlet;  
  21. import javax.servlet.http.HttpServletRequest;  
  22. import javax.servlet.http.HttpServletResponse;  
  23.   
  24. import sun.misc.BASE64Encoder;  
  25.   
  26. public class Register extends HttpServlet {  
  27.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  28.             throws ServletException, IOException {  
  29.         request.getSession().setAttribute("token", TokenProcessor.getInstance().generateToken());//添加一個令牌屬性  
  30.         request.getRequestDispatcher("/register.jsp").forward(request, response);   //轉發至註冊頁面表單  
  31.     }  
  32. }  
  33. //令牌,用於參數一個隨機唯一的令牌值  
  34. class TokenProcessor{  
  35.     private TokenProcessor(){}  
  36.     private static final TokenProcessor token = new TokenProcessor();  
  37.     public static TokenProcessor getInstance(){  
  38.         return token;  
  39.     }  
  40.     public String generateToken(){  
  41.         String token = System.currentTimeMillis()+new Random().nextInt()+"";    //隨機的值  
  42.         try {  
  43.             MessageDigest md = MessageDigest.getInstance("md5");        //注意下面的處理方式  
  44.             byte[] md5 = md.digest(token.getBytes());  
  45.             return new BASE64Encoder().encode(md5); //base64編碼    
  46.         } catch (NoSuchAlgorithmException e) {  
  47.             throw new RuntimeException(e);  
  48.         }  
  49.     }  
  50.       
  51. }  


 

[html] view plaincopy
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %>  
  6.   
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  8. <html>  
  9.   <head>  
  10.     <base href="<%=basePath%>">  
  11.       
  12.     <title>歡迎您註冊</title>  
  13.       
  14.     <meta http-equiv="pragma" content="no-cache">  
  15.     <meta http-equiv="cache-control" content="no-cache">  
  16.     <meta http-equiv="expires" content="0">      
  17.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  18.     <meta http-equiv="description" content="This is my page">  
  19.     <style type="text/css">  
  20.         body{  
  21.         margin-left: 100px;  
  22.         margin-bottom: 100px;  
  23.         }  
  24.         #reg{  
  25.         margin: auto;  
  26.         margin-left: auto;  
  27.         }  
  28.         .one{  
  29.         background-color: #C9FADB;  
  30.         }  
  31.         .two{  
  32.         background-color: #FFFFCC;  
  33.         }  
  34.     </style>  
  35.   
  36.   </head>  
  37.     
  38.   <body>  
  39.   <div name="rge">  
  40.     <form action="/Day01/servlet/doRegister" method="post">  
  41.         <input type="hidden" name="token" value="${token}">   <!-- 傳遞一個令牌值 -->>  
  42.         <table border="1" bordercolor="#000099" width="523" cellpadding="10" cellspacing="0" height="343">  
  43.             <tr><td colspan="2" align="center">註冊頁面</td></tr>  
  44.             <tr>  
  45.                 <td class="one">用戶名:</td>  
  46.                 <td class="two"><input type="text" name="username"></td>  
  47.             </tr>  
  48.             <tr>  
  49.                 <td class="one">密碼:</td>  
  50.                 <td class="two"><input type="password" name="pass" /></td>  
  51.             </tr>  
  52.             <tr>  
  53.                 <td class="one">確認密碼:</td>  
  54.                 <td class="two"><input type="password" name="pass" /></td>  
  55.             </tr>  
  56.             <tr>  
  57.                 <td class="one">性別:</td>  
  58.                 <td class="two">  
  59.                     <input type="radio" name="sex" value="nan" />男  
  60.                     <input type="radio" name="sex" value="nv" />女  
  61.                 </td>  
  62.             </tr>  
  63.             <tr>  
  64.                 <td  class="one">技術:</td>  
  65.                 <td class="two">  
  66.                     <input type="checkbox" name="tech" value="Java"/>Java  
  67.                     <input type="checkbox" name="tech" value="Html"/>Html  
  68.                     <input type="checkbox" name="tech" value="C++"/>C++  
  69.                 </td>  
  70.             </tr>  
  71.             <tr>  
  72.                 <td class="one">國家:</td>  
  73.                 <td class="two">  
  74.                     <select name="country">  
  75.                         <option value="none">---國家---</option>  
  76.                         <option value="zn">中國</option>  
  77.                         <option value="usa">美國</option>                   
  78.                     </select>  
  79.                 </td>  
  80.             </tr>  
  81.             <tr bgcolor="#CCFFFF">  
  82.                 <th colspan="2">  
  83.                 <input type="submit" value="提交數據" />  
  84.                 <input type="reset" value="置空" />  
  85.                 </th>  
  86.             </tr>  
  87.         </table>  
  88.     </form>  
  89.    </div>  
  90.   </body>  
  91. </html>  

 

[java] view plaincopy
  1. /* 
  2.  * doRegister.java 
  3.  */  
  4. package com.baidu;  
  5. import java.io.IOException;  
  6. import java.io.PrintWriter;  
  7.   
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.http.HttpServlet;  
  10. import javax.servlet.http.HttpServletRequest;  
  11. import javax.servlet.http.HttpServletResponse;  
  12.   
  13. public class doRegister extends HttpServlet {  
  14.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  15.     throws ServletException, IOException {  
  16.         String serverToken = (String) request.getSession().getAttribute("token");  
  17.         String clientToken = request.getParameter("token");  
  18.         if(serverToken!=null && serverToken.equals(clientToken)){   //比對令牌值是否相等  
  19.             System.out.println("註冊成功!");  
  20.             request.getSession().removeAttribute("token");  
  21.             return;  
  22.         }  
  23.         System.out.println("註冊失敗!");  
  24.         return;  
  25.     }  
  26. }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章