smhy8187

 

ASP.net防止用户后退、刷新造成重复提交的方法研究

 ASP.net防止用户后退、刷新造成重复提交的方法研究

 

 [原创 2006-06-01 08:08:22 ] 发表者: 斯克迪亚


禁止用户后退继而重复提交数据似乎是个很头疼的事,我查了很多网上的相关文章,遍及各种实现方法,都指出了很多问题,比如不支持旧版IE以及FireFox、必须开启Cookies等,反正没找到一个能完美解决的办法,有这些漏洞就等于是给不法用户敞开了门。

我想最终还是应该在服务器方面来解决这个问题,现在研究出了一个简单的方法,虽然能够很有效的制止重复提交,但似乎有点过了。。。

实现方法如下:

在页面的类中定义:

//定义静态成员变量
static bool UpData;

 
然后书写页面载入事件:

protected void Page_Load(object sender, EventArgs e)
{
        if (!IsPostBack)
        {
            //如果是页面第一次载入就将UpData设为false
            UpData = false;
        }
}

书写提交按钮事件:

protected void Button1_Click(object sender, EventArgs e)
 {

        //如果页面已经提交过(UpData为true)就不进行任何操作,直接返回
        if(UpData)return;


        //这里书写表单验证及写入数据库的代码

        //表单验证成功并提交到数据库之后将UpData设为true
       UpData=true;

        //这里书写转往其他页面或进行后续处理的代码
}


这样用户只要成功提交之后,在提交过程中刷新页面或是提交一次后按后退按钮都不能再反复提交了。

作者BLOG: http://hexun.com/icesee

不过这样还有一些问题,就是当用户同时打开两页相同页面时,提交了其中一个之后,再去提交另一个时提交就无效了,目前尚不确知当N个用户先后连接服务器打开同一页面之后,一个用户提交后其他用户是否还能正确提交,但鉴于ASP.net的糟糕的表单提交事件机制,又不得不使用静态变量来存储(动态变量会在提交表单的事件执行前重置),不知是否有更可靠的方法来实现呢。

 

防止刷新!

解决方案:利用Session在五分钟之内不允许用户重复提交数据!

if (Session["TellManage_SendTime"]!=null)
      {
       long dt=Convert.ToInt64(Session["TellManage_SendTime"].ToString());
       if (dt>System.DateTime.Now.Ticks)
       {
        return;
       }
      }


//你的处理程序

Session["TellManage_SendTime"]=System.DateTime.Now.AddMinutes(5).Ticks;

 

posted on 2007-08-02 16:50  new2008  阅读(666)  评论(0)    收藏  举报

导航