net 防止重复提交

微软防止重复提交方案,修改版


Code
public class RefreshServe : System.Web.UI.Page
    {
        private static ILog log = LogManager.GetLogger(typeof(RefreshServe));         private readonly string REFRESH_TICKET_NAME = "__RefreshTicketArray";
        private readonly string HIDDEN_FIELD_NAME = "__RefreshHiddenField";
        private readonly string HIDDEN_PAGE_GUID = "__RefreshPageGuid";         /// <summary>
        /// 为True表示页面刷新,False为正常提交
        /// </summary>
        public bool IsPageRefreshed
        {
            get
            {
                if (IsPostBack && !CheckRefreshFlag())
                {
                    log.Debug("刷新了页面");
                    return true;
                }
                else
                {
                    log.Debug("正常提交");
                    return false;
                }
            }
        }         /// <summary>
        /// 呈现前更新标识
        /// </summary>
        /// <param name="e"></param>
        protected override void OnPreRender(EventArgs e)
        {
            log.Debug("执行OnPreRender");
            base.OnPreRender(e);
            UpdateRefreshFlag();
        }         /// <summary>
        /// 更新标识,正常提交都删除该次提交的时间,并生产当前新的时间
        /// </summary>
        private void UpdateRefreshFlag()
        {             #region Cookie模式             //注册页面唯一标识并返回
            string pageGuid = SetCurPageGuid();             HttpCookie cookie = GetRefreshTicket();
           
            if (cookie.Values.Count > )
            {
                cookie.Values.Remove(pageGuid);
                log.Debug("当前清除的cookie变是:" + pageGuid);
            }             string submitTime = DateTime.Now.ToString("hhmmss.fffff");
            //当前提交时间保存到隐藏域
            ClientScript.RegisterHiddenField(HIDDEN_FIELD_NAME, submitTime);             log.Debug("即将要新增的时间:submitTime:" + submitTime + "  Guid:" + pageGuid.ToString());
            cookie.Values.Add(pageGuid, submitTime);             log.Debug("UpdateRefreshFlag中当前Cookie中存在的记录数为:" + cookie.Values.Count);
            for (int i = ; i < cookie.Values.Count; i++)
                log.Info("cookie[" + cookie.Values.GetKey(i) + "]:" + cookie.Values[i]);             Response.AppendCookie(cookie);             #endregion         }         /// <summary>
        /// 验证是否刷新
        /// </summary>
        /// <returns></returns>
        private bool CheckRefreshFlag()
        {
            HttpCookie cookie = GetRefreshTicket();
            string pageGuid = GetCurPageGuid();
            if (cookie.Values.Count > )
            {
                bool flag;
                if (cookie.Values[pageGuid] != null)
                    flag = cookie.Values[pageGuid].IndexOf(GetCurSubmitTime()) > -;
                else
                    flag = true;//防止出现异常,总是可以提交
                if (flag)
                    log.Debug("提交时间存在,可以提交");
                else
                    log.Debug("无效的提交时间");
                return flag;
            }
            return true;
        }         /// <summary>
        /// 得到已保存的提交时间,没有新建,有返回
        /// </summary>
        /// <returns></returns>
        private HttpCookie GetRefreshTicket()
        {            
            #region Cookie模式,返回值为Cookie             HttpCookie cookie;
            if (Request.Cookies[REFRESH_TICKET_NAME] == null)
            {
                cookie = new HttpCookie(REFRESH_TICKET_NAME);
                Response.AppendCookie(cookie);
                log.Debug("Cookie不存在,初始化");
            }
            else
            {
                cookie = Request.Cookies[REFRESH_TICKET_NAME];                 log.Debug("读取已存在的Cookie,当前Cookie中存在的记录数为:" + cookie.Values.Count + "具体有如下几条:");                 for (int i = ; i < cookie.Values.Count; i++)
                    log.Info("cookie[" + cookie.Values.GetKey(i) + "]:" + cookie.Values[i]);
            }
            return cookie;
            #endregion
        }         /// <summary>
        /// 获取当前提交时间
        /// </summary>
        /// <returns></returns>
        private string GetCurSubmitTime()
        {
            string submitTime = Request.Params[HIDDEN_FIELD_NAME] == null ? "" : Request.Params[HIDDEN_FIELD_NAME].ToString();
            log.Debug("执行GetCurSubmitTime:submitTime为:" + submitTime);
            return submitTime;
        }         /// <summary>
        /// 设置页面唯一标识,通过Guid标识来区分每个页面自己的提交时间
        /// </summary>
        private string SetCurPageGuid()
        {
            string guid;
            if (!IsPostBack)
            {
                if (Request.Params[HIDDEN_PAGE_GUID] == null)
                {
                    guid = System.Guid.NewGuid().ToString();
                    log.Debug("SetCurPageGuid注册了一个新的标识:" + guid);
                }
                else
                    guid = GetCurPageGuid();             }
            else
            {
                guid = GetCurPageGuid();               
            }             ClientScript.RegisterHiddenField(HIDDEN_PAGE_GUID, guid);
            return guid;
        }           /// <summary>
        /// 得到当前页面的唯一标识
        /// </summary>
        /// <returns></returns>
        private string GetCurPageGuid()
        {
            string pageGuid = Request.Params[HIDDEN_PAGE_GUID] == null ? "none" : Request.Params[HIDDEN_PAGE_GUID].ToString();
            log.Debug("执行GetCurPageGuid()后Page_GUID为:" + pageGuid);
            return pageGuid;
        }
}

需要刷新判断功能时新页面只需继承该类就可,通过引用属性IsPageRefreshed识别"为真表示刷新,假则是正常提交",将数据库的操作写在
if(!IsPageRefreshed)
{
   数据库操作
}

.net防止刷新重复提交(转)的更多相关文章

  1. ASP.Net中防止页面刷新重复提交的几种方法

    [摘要] 目前很多网站都要提交页面插入或更新数据库,比如留言本,一个用户提交留言后,如果按F5,就会重新提交一遍留言,导致数据库出现两条一模一样的留言,本文介绍了几种防止页面刷新,导致重复提交数据的方 ...

  2. (转)ASP.NET禁用刷新重复提交Backspace键

    在网页制作中,由于Backspace键可以回退到上一个网页,利用了缓存的数据,从而导致一些错误发生.浏览器的后退按钮使得我们能够方便地返回以前访问过的页面,它无疑非常有用.但有时候我们不得不关闭这个功 ...

  3. asp.net网页防刷新重复提交、防后退解决办法!

    原文发布时间为:2008-10-14 -- 来源于本人的百度文章 [由搬家工具导入] 1、提交后 禁用提交按钮(像CSDN这样)2、数据处理成功马上跳转到另外一个页面! 操作后刷新的确是个问题,你可以 ...

  4. PHP防止页面刷新、重复提交数据

    PHP防止页面刷新.重复提交数据 (2011-12-09 16:52:45) 转载▼ 标签: it 分类: php技术相关 闲来无事看了一下php session ,又在网上看了防止页面刷新重复提交数 ...

  5. asp.net 防止页面刷新或后退引起重复提交

     项目中经常遇到刷新后重复的向数据库增加一条相同的记录,造成数据重复,如何规避这些问题呢?下面我们就一起讨论一下在asp.net怎样防止页面刷新或后退引起重复提交数据的问题: 其实asp.net防止刷 ...

  6. java web解决表单重复提交问题

    我们大家再进行web开发的时候,必不可少会遇见表单重复提交问题.今天就来给总结如何解决表单提交问题,欢迎大家交流指正. 首先我们在讨论如何解决表单重复提交问题之前先来解决三个问题:1.什么叫表单重复提 ...

  7. java web解决表单重复提交

    首先我们在讨论如何解决表单重复提交问题之前先来解决三个问题:1.什么叫表单重复提交?2.什么情况下会出现表单重复提交?3.什么情况需要避免表单重复提交? 什么叫表单提交问题,说白了,就是同一份信息,重 ...

  8. 防止刷新/后退引起的重复提交问题的Java Token代码,非Struts

    贴子转自http://hi.baidu.com/bobylou,转之前并没有验证文章里的方法是不是有效,估计原作者把它放到blog之前应该做过测试了吧. Struts本身有一套完善的防止重复提交表单的 ...

  9. 求教——使用node做表单,刷新浏览器页面,浏览器为什么会重复提交上次所填的信息

    最近在学些node,按照<nodejs实战>上的代码做练习,发现有表单重复提交的问题 第一次打开页面,显示如图是get请求 图1 现在我们提交aaa,显示如图,post请求 图2 刷新页面 ...

随机推荐

  1. 【转载51CTO】Linux中引号那些事儿

    原文链接:http://os.51cto.com/art/201207/348855.htm 我们将把编写脚本的事情暂时搁在一边,然后来讨论一些,我们一直在用的,但是没有解释的东西.引号在这一节里面, ...

  2. PF_NETLINK应用实例NETLINK_KOBJECT_UEVENT具体实现--udev实现原理

    PF_NETLINK应用实例NETLINK_KOBJECT_UEVENT具体实现--udev实现原理 相对于linux来说,udev还是一个新事物.然而,尽管它03年才出现,尽管它很低调(J),但它无 ...

  3. 【1】JAVA---地址App小软件(AddressApp.class)(初步接触项目开发的分层思想)(表现层)

    这个是表现层的main方法. 实现的地址信息有: 姓名,性别,年龄,电话,地址. 实现的功能有: 增加地址: 删除地址: 修改地址: 查找地址:其中年龄的查找为年龄段的查找. 数据存储的方式为文件存储 ...

  4. iOS进阶读物

    不知不觉作为 iOS 开发也有两年多的时间了,记得当初看到 OC 的语法时,愣是被吓了回去,隔了好久才重新耐下心去啃一啃.啃了一阵,觉得大概有了点概念,看到 Cocoa 那么多的 Class,又懵了, ...

  5. [Java] Tcp/udp 简单通信

    本文转自  我自己的博客guozeyiblog.cn 欢迎来訪 效果图: //UDP通信 import java.awt.*; import java.awt.event.ActionEvent; i ...

  6. SQL基础--&gt; 约束(CONSTRAINT)

    --============================= --SQL基础--> 约束(CONSTRAINT) --============================= 一.几类数据完 ...

  7. LSPCI具体解释分析

    一.PCI简单介绍     PCI是一种外设总线规范.我们先来看一下什么是总线:总线是一种传输信号的路径或信道.典型情况是,总线是连接于一个或多个导体的电气连线,总 线上连接的全部设备可在同一时间收到 ...

  8. 【iOS与EV3混合机器人编程一系列五个】iOS_WiFi_EV3_Library 解剖连接EV3

    在上一篇文章中.我们解说了怎样用开源码库CocoaAsyncSocket来实现iOS上的UDP和TCP数据通信.那么在本文中.我们将介绍在CocoaAsyncSocket的基础怎样使用UDP和TCP连 ...

  9. OKHttp源码解析

    http://frodoking.github.io/2015/03/12/android-okhttp/ Android为我们提供了两种HTTP交互的方式:HttpURLConnection 和 A ...

  10. nginx 配置轮询服务

    通常我们应用nginx做代理时,用到它的轮训服务 #设置轮询名称 upstream zyy{ server 127.0.0.1:8080  #本机的apache服务 } server { listen ...