当前位置: 代码迷 >> Web前端 >> 防止页面表单重复提交的解决办法
  详细解决方案

防止页面表单重复提交的解决办法

热度:134   发布时间:2012-10-08 19:54:56.0
防止页面表单重复提交的解决方法
当我们写了个注册页面时候,用户完成注册并提交,用户注册的资料并录入数据库保存,最不希望出现的是在一个会话中出现多次提交的结果,我们可以通过为请求设置标记来避免此类事件的发生。

   1.为每个请求设置一个标记,当此页面是首次被请求时,生成标记并放入session中,并且把此生成的标记的值作为隐含标签传递到处理页面

   2.提交表单时,跳转页面处理请求中的标记,如果判断请求中session对象的标记和隐含标签中的值相同,处理请求,并将session中的标记值去除

( TokenGen.java)
package com.beans;  

02    

03 import java.util.*;  

04 import javax.servlet.http.*;  

05    

06 public class TokenGen {  

07     private static TokenGen instance = new TokenGen();  

08    

09     private TokenGen() {}  

10    

11     public static TokenGen getInstance() {  

12         return instance;  

13     }  

14    

15     public synchronized boolean isTokenValid(HttpServletRequest request) {  

16         // 没有session,判为非法  

17         HttpSession session = request.getSession(false);   

18         if (session == null)  

19             return false;  

20    

21         // session中不含token,  

22         // 说明form被提交过后执行了resetToken()清除了token  

23         // 判为非法  

24         String stoken = (String) session.getAttribute("token");   

25         if (stoken == null)  

26             return false;  

27    

28         // request请求参数中不含token,  

29         // 判为非法  

30         String rtoken = request.getParameter("token");  

31         if (rtoken == null)  

32             return false;  

33    

34         // request请求中的token与session中保存的token不等,判为非法  

35         return stoken.equals(rtoken);  

36     }  

37        

38     /*  

39      * 重新设置token,当页面被请求后,将session中的token属性去除  

40      */  

41     public synchronized void resetToken(HttpServletRequest request)  

42     {  

43         HttpSession session = request.getSession(false);  

44         if (session!=null)  

45         {  

46             session.removeAttribute("token");  

47         }  

48     }  

49     /*  

50      * 为请求新建一个token标记,此标记由一个随机的double数toString形成,并把字符值存入session中  

51      */ 

52        

53     public synchronized void saveToken(HttpServletRequest request)  

54     {  

55         HttpSession session = request.getSession(true);  

56         Random rand = new Random();  

57         Double d = rand.nextDouble();  

58         session.setAttribute("token", d.toString());      

59     }  

60 } 



(form.jsp) 其中加粗加红为生成token标记的代码

<%@ page language="java" import="com.beans.*" pageEncoding="gb2312"%>  

02    

03    

04 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  

05 <html>  

06  <head>  

07    

08   <title>注册页面1</title>  

09    

10   <meta http-equiv="pragma" content="no-cache">  

11   <meta http-equiv="cache-control" content="no-cache">  

12   <meta http-equiv="expires" content="0">  

13   <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  

14   <meta http-equiv="description" content="This is my page">  

15  </head>  

16  <%  

17   TokenGen.getInstance().saveToken(request);  

18   String s = (String)session.getAttribute("token");   

19  %>  

20  <body>  

21   <form id="form1" name="form1" method="post" action="register.jsp">  

22      

23    <table align="center">  

24    <tr>  

25     <td colspan="2"><br><input type="hidden" name="token" value="<%=s%>"/>  

26     </td>  

27    </tr>  

28     <tr>  

29      <td align="right">  

30       用户名:  

31      </td>  

32      <td>  

33       <input type="text" name="t1" />  

34      </td>  

35     </tr>  

36    

37     <tr>  

38      <td align="right">  

39       密码:  

40      </td>  

41      <td>  

42       <input type="password" name="t2" />  

43      </td>  

44     </tr>  

45    

46     <tr>  

47      <td align="right">  

48       确认密码:  

49      </td>  

50      <td>  

51       <input type="password" name="t3" />  

52      </td>  

53     </tr>  

54    

55     <tr>  

56      <td align="right">  

57       性别:  

58      </td>  

59      <td>  

60       <input type="radio" name="radio" id="radio" value="boy" />  

61       男  

62       <input type="radio" name="radio" id="radio2" value="gril" />  

63       女  

64      </td>  

65     </tr>  

66    

67     <tr>  

68      <td align="right">  

69       个人说明:  

70      </td>  

71      <td>  

72       <textarea name="textraea1" rows="15" cols="60"></textarea>  

73      </td>  

74     </tr>  

75    

76     <tr>  

77      <td align="right">  

78       <input type="submit" name="button" id="button" value="提交" />  

79      </td>  

80      <td>  

81       <input type="reset" name="button2" id="button2" value="重置" />  

82      </td>  

83     </tr>  

84    </table>  

85   </form>  

86  </body>  

87 </html> 



(register.jsp)处理请求

<%@ page language="java" import="com.beans.*" pageEncoding="gb2312"%>  

02    

03    

04 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  

05 <html>  

06   <head>  

07    

08        

09     <title>处理注册页面1</title>  

10        

11  <meta http-equiv="pragma" content="no-cache">  

12  <meta http-equiv="cache-control" content="no-cache">  

13  <meta http-equiv="expires" content="0">      

14  <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  

15  <meta http-equiv="description" content="This is my page">  

16  <!--  

17  <link rel="stylesheet" type="text/css" href="styles.css">  

18  --> 

19    

20   </head>  

21      

22   <body>  

23    <%  

24     TokenGen tokenGen=TokenGen.getInstance();  

25     if (!tokenGen.isTokenValid(request))  

26     {  

27      out.print("这是重复提交或非法提交!");  

28     }  

29     else  

30     {  

31      // 处理请求,并执行resetToken方法,将session中的token去除  

32      tokenGen.resetToken(request);  

33     }  

34        

35     %>  

36   </body>  

37 </html> 

  相关解决方案