`
wjheye
  • 浏览: 82268 次
  • 性别: Icon_minigender_1
  • 来自: 河南
社区版块
存档分类
最新评论

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

    博客分类:
  • Jsp
阅读更多
当我们写了个注册页面时候,用户完成注册并提交,用户注册的资料并录入数据库保存,最不希望出现的是在一个会话中出现多次提交的结果,我们可以通过为请求设置标记来避免此类事件的发生。

   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> 

分享到:
评论

相关推荐

    [Jsp]防止页面表单重复提交的解决方法

    NULL 博文链接:https://feng5588feng.iteye.com/blog/1494002

    ASP.NET中防止刷新页面造成表单重复提交

    ASP.NET中防止刷新页面造成表单重复提交

    防止表单重复提交(asp.net )

    防止表单重复提交。判断是新打开的页面还是刷新的页面 判断是新打开的页面还是刷新的页面

    java实现防止表单重复提交

    服务器端避免表单的重复提交,利用同步令牌来解决重复提交的基本原理如下:(1)用户访问提交数据的页面,服务器端在这次会话中,创建一个session对象,并产生一个令牌值,将这个令牌值作为隐藏输入域的值,随表单一起发送到...

    Struts2防止表单重复提交

    当用户将信息提交到服务器,服务器响应采用forward方式调转到下一个页面后,此时地址栏中显示的是上个页面的URL,若刷新当前页面,浏览器会将再次提交用户先前输入的数据,就会再次出现表单重复提交的问题。...

    几种防止表单重复提交的方法

    几种防止表单重复提交的方法 禁掉提交按钮。表单提交后使用Javascript使提交按钮disable。这种方法防止心急的用户多次点击按钮。但有个问题,如果客户端把Javascript给禁止掉,这种方法就无效了。 我之前的文章曾说...

    ThinkPHP防止重复提交表单的方法实例分析

    在开发中,如果一个新增或修改的表单,在后台完成数据库操作后我们设定的不是跳转到其他页面,还是返回本页面,这时点击浏览器的后退再提交或刷新页面,会导致form表单重复提交,即这条记录会被增加或修改两次。...

    thinkphp3.2 防止表单重复提交

    html 页面 {:form_token()} php 控制器 form_token(U('.../index')); 实现重复提交跳转

    ThinkPHP 防止表单重复提交的方法

    用户提交表单以后,点击浏览器后退按钮返回表单页面,这个时候浏览器会直接从缓存中取出页面,因此token验证一定是通不过的。 网上有许多种办法可以绕过这个问题,比如用location.replace()方法来替换当前历史记录,...

    PHP防止表单重复提交的几种常用方法汇总

    本文较为详细的汇总了PHP防止表单重复提交的几种常用方法,在PHP程序开发中有着很高的实用价值。具体方法如下: 1. 使用JS让按钮在点击一次后禁用(disable)。采用这种方法可以防止多次点击的发生,实现方式较简单...

    ExtJs4.0 表单提交Demo

    一个简单的ExtJs4.0搭建环境,利用Ext Ajax的方式提交表单,可使得显示层和控制层完全分开.

    php表单加入Token防止重复提交的方法分析

    Token一般用在两个地方——防止表单重复提交、anti csrf攻击(跨站点请求伪造)。 两者在原理上都是通过session token来实现的。当客户端请求页面时,服务器会生成一个随机数Token,并且将Token放置到session当中,...

    解决vue 按钮多次点击重复提交数据问题

    主要介绍了vue 按钮多次点击重复提交数据的问题,本文通过实例结合的形式给大家介绍的非常详细,需要的朋友可以参考下

    ASP.NET中防止页面刷新造成表单重复提交执行两次操作

    之前看过别人防刷新的方法,是让页面刷新或...在提交表单时,判断表单中提交上来的Hidden和Session中的标志是否一致,就可以知道是正常的提交表单,还是刷新页面导致的重复提交。需要注意的是,在每次提交表单的处理

    PHP+Session防止表单重复提交的解决方法

    当前表单页面is_submit设为0 SESSION_START(); $_SESSION['is_submit'] = 0; &lt;form id="reg" action="post.php" method="post"&gt; 用户名:&lt;input type="text" class="input" name="username" id="user"&...

    详解struts2的token机制和cookie来防止表单重复提交

    详解struts2的token机制和cookie来防止表单重复提交 今天在做一个投票系统时要实现防止表单重复提交! 当时就想到了用struts2提供的token机制 struts2的token机制防止表单重复提交: 首先需要在提交的jsp页面(要...

    .NET 刷新页面防止表单二次提交的实现方法

    1、页面上按钮是服务器控件,现在刷新页面要防止按钮事件重复执行 您可能感兴趣的文章:ASP.NET中防止页面刷新造成表单重复提交执行两次操作asp.net 处理F5刷新页面重复提交页面的一个思路

    PHP防止刷新重复提交页面的示例代码

    PHP防止刷新重复提交,通过不断刷新(Refresh or Reload)表单提交页面,可以重复提交表单内容,可以利用 PHP 的 Session 来避免这一点,Session 保存在服务器端,在 PHP 过程中改变 Session 变量的值后,即保存在...

    php解决和避免form表单重复提交的几种方法

    在PHP提交表单的时候,可能遇到网速等导致页面突然加载变慢,用户重复地点击提交按钮,将在数据库产生多条数据,导致不可控情况。那么如何避免和解决这种问题呢?下面来一起看看。

    asp.net 防止用户通过后退按钮重复提交表单

    防止用户通过后退按钮重复提交表单 &lt;&#37; response.Buffer=true response.Expires=0 response.ExpiresAbsolute=now()-1 response.CacheControl=”no-cache” %&gt; response.Buffer=true的意思就是指明输出页面是否...

Global site tag (gtag.js) - Google Analytics