彻底解决刷新重复提交问题,你还在用ResponseRedirect吗_第1页
彻底解决刷新重复提交问题,你还在用ResponseRedirect吗_第2页
彻底解决刷新重复提交问题,你还在用ResponseRedirect吗_第3页
彻底解决刷新重复提交问题,你还在用ResponseRedirect吗_第4页
彻底解决刷新重复提交问题,你还在用ResponseRedirect吗_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、彻底解决刷新重复提交问题,你还在用Response.Redirect吗?以前也研究过,始终没找到好的办法,看了微软Msdn上的解决方案,使用后发现存在较多漏洞,考虑的情况太少,如页面加载后没有提交,始终刷新,在同一浏览器打开多个各选项卡,每个选项卡打开同一页面或不同页面,以下是我的解决方案,Codepublic class RefreshServe : System.Web.UI.Page            private 

2、;static ILog log = LogManager.GetLogger(typeof(RefreshServe);        private readonly string REFRESH_TICKET_NAME = "_RefreshTicketArray"        private readonly

3、 string HIDDEN_FIELD_NAME = "_RefreshHiddenField"        private readonly string HIDDEN_PAGE_GUID = "_RefreshPageGuid"        / <summary> &

4、#160;      / 为True表示页面刷新,False为正常提交        / </summary>        public bool IsPageRefreshed            &#

5、160;       get                            if (IsPostBack && !CheckRefreshFlag()    

6、;                                log.Debug("刷新了页面");             

7、       return true;                                else       

8、60;                            log.Debug("正常提交");                 

9、;   return false;                                            

10、;/ <summary>        / 呈现前更新标识        / </summary>        / <param name="e"></param>      &#

11、160; protected override void OnPreRender(EventArgs e)                    log.Debug("执行OnPreRender");           

12、; base.OnPreRender(e);            UpdateRefreshFlag();                / <summary>        / 更新标识,正常提

13、交都删除该次提交的时间,并生产当前新的时间        / </summary>        private void UpdateRefreshFlag()                   

14、0;#region Cookie模式            /注册页面唯一标识并返回            string pageGuid = SetCurPageGuid();            

15、;HttpCookie cookie = GetRefreshTicket();                       if (cookie.Values.Count > 0)          &

16、#160;                 cookie.Values.Remove(pageGuid);                log.Debug("当前清除的cookie变是:" + pageGuid); &

17、#160;                      string submitTime = DateTime.Now.ToString("hhmmss.fffff");            /当前提交时间保

18、存到隐藏域            ClientScript.RegisterHiddenField(HIDDEN_FIELD_NAME, submitTime);            log.Debug("即将要新增的时间:submitTime:" + submitTime + &quo

19、t;  Guid:" + pageGuid.ToString();            cookie.Values.Add(pageGuid, submitTime);            log.Debug("UpdateRefreshFlag中当前Cookie中存在的记录数为:&q

20、uot; + cookie.Values.Count);            for (int i = 0; i < cookie.Values.Count; i+)                log.Inf

21、o("cookie" + cookie.Values.GetKey(i) + ":" + cookie.Valuesi);            Response.AppendCookie(cookie);            #endregion 

22、;               / <summary>        / 验证是否刷新        / </summary>        / 

23、<returns></returns>        private bool CheckRefreshFlag()                    HttpCookie cookie = GetRefreshTicket(); 

24、           string pageGuid = GetCurPageGuid();            if (cookie.Values.Count > 0)           

25、                 bool flag;                if (cookie.ValuespageGuid != null)      &#

26、160;             flag = cookie.ValuespageGuid.IndexOf(GetCurSubmitTime() > -1;                else     

27、0;              flag = true;/防止出现异常,总是可以提交                if (flag)           &#

28、160;        log.Debug("提交时间存在,可以提交");                else                   

29、; log.Debug("无效的提交时间");                return flag;                        retur

30、n true;                / <summary>        / 得到已保存的提交时间,没有新建,有返回        / </summary>    &

31、#160;   / <returns></returns>        private HttpCookie GetRefreshTicket()                        

32、        #region Cookie模式,返回值为Cookie            HttpCookie cookie;            if (Request.CookiesREFRESH_TICKET_NAME =

33、60;null)                            cookie = new HttpCookie(REFRESH_TICKET_NAME);          

34、0;     Response.AppendCookie(cookie);                log.Debug("Cookie不存在,初始化");                 

35、60;      else                            cookie = Request.CookiesREFRESH_TICKET_NAME;      

36、;          log.Debug("读取已存在的Cookie,当前Cookie中存在的记录数为:" + cookie.Values.Count + "具体有如下几条:");                for (int i

37、0;= 0; i < cookie.Values.Count; i+)                    log.Info("cookie" + cookie.Values.GetKey(i) + ":" + cookie.Valuesi)

38、;                        return cookie;            #endregion         

39、       / <summary>        / 获取当前提交时间        / </summary>        / <returns></returns>  

40、0;     private string GetCurSubmitTime()                    string submitTime = Request.ParamsHIDDEN_FIELD_NAME = null ? "&qu

41、ot; : Request.ParamsHIDDEN_FIELD_NAME.ToString();            log.Debug("执行GetCurSubmitTime:submitTime为:" + submitTime);            return submitT

42、ime;                / <summary>        / 设置页面唯一标识,通过Guid标识来区分每个页面自己的提交时间        / </summary>   

43、60;    private string SetCurPageGuid()                    string guid;            if (!IsPostBack)&#

44、160;                           if (Request.ParamsHIDDEN_PAGE_GUID = null)             

45、;                       guid = System.Guid.NewGuid().ToString();                  

46、60; log.Debug("SetCurPageGuid注册了一个新的标识:" + guid);                                else     

47、               guid = GetCurPageGuid();                        else                            guid = GetCurPageGu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论