1.使用Session,避免用户重复提交(F5刷新时)

0.起因

        当用户上传文件后F5刷新浏览器会导致文件的重复提交和相关程序的重复执行。
 

1.实现原理

        由于刷新提交表单,实际上提交的就是上一次正常提交的表单,所以我们只要做一个标志,判断出是新表单还是上一次的旧表单就可以分辨出是否进行了重复提交操作。
 

2.实现方法

        在页面上放置一个Hidden域,当页面第一次载入的时候,在Session里面保存一个标志,同时,把这个标志保存到页面上的Hidden里面。
        在提交表单时,判断表单中提交上来的Hidden和Session中的标志是否一致,就可以知道是正常的提交表单,还是刷新页面导致的重复提交。
        需要注意的是,在每次提交表单的处理之后,要更新Session里面的标志。

3.调试后发现的实现原理

  Session值 Hidden值
第一次页面载入后 初试化为A 初始化为A
第一次提交表单后 由A变成B 由A变成B
F5刷新页面时 用B去进行比较 用A去进行比较
F5刷新页面后 初始化为C 初始化为C
第二次提交表单时 用C比较 用C比较
 
也就是说F5刷新页面,到这一句时
if(Request.Form.Get("hiddenTestN").Equals(GetToken()))
GetToken()获取的是Session已经更新后的值 B
Request.Form.Get("hiddenTestN")获取的是Hidden以前的值 A
而真正的提交表单时,Request.Form.Get("hiddenTestN")也获取的是Hidden更新后的值 B

4.代码

前台
<asp:FileUploadID="FileUploadChange"runat="server"CssClass="col-lg-3"/>
<asp:ButtonID="ButtonUploadChange"runat="server"CausesValidation="false"CssClass="btn btn-primary"OnClick="ButtonUploadChange_Click"Text="上传"ToolTip="仅允许上传.csv文件"/>
<input id="hiddenTest" type="hidden" value="<%=GetToken() %>" name="hiddenTestN"/>
后台
using System.Web.Security;
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if ( Session["Token"]==null )
{
SetToken();
}
}
}
//获得当前Session里保存的标志
public string GetToken()
{
if (Session["Token"] != null)
{
return Session["Token"].ToString();
}
else
{
return string.Empty;
}
}
//生成标志,并保存到Session
private void SetToken()
{
Session.Add("Token", UserMd5(Session.SessionID + DateTime.Now.Ticks.ToString()));
}
//这个函数纯粹是为了让标志稍微短点儿,一堆乱码还特有神秘感,另外,这个UserMd5函数是网上找来的现成儿的
protected string UserMd5(string str1)
{
string cl1 = str1;
string pwd = "";
MD5 md5 = MD5.Create();
// 加密后是一个字节类型的数组
byte[] s = md5.ComputeHash(Encoding.Unicode.GetBytes(cl1));
// 通过使用循环,将字节类型的数组转换为字符串,此字符串 是常规字符格式化所得
for (int i = ; i < s.Length; i++)
{
// 将得到的字符串使用十六进制类型格式。格式后的字符是 小写的字母,如果使用大写(X)则格式后的字符是大写字符
pwd = pwd + s[i].ToString("X");
}
return pwd;
}
protected void ButtonUploadChange_Click(object sender, EventArgs e)
{
if (Request.Form.Get("hiddenTestN").Equals(GetToken()))
{
// 此处写按钮执行的具体代码
SetToken();//别忘了最后要更新Session中的标志
}
else
{
Response.Redirect(Request.RawUrl);//手动给用户刷新页面
}
} }
每个上传按钮都要写成这种格式
protected void BtnUpload(object sender, EventArgs e)
{
if (Request.Form.Get("hiddenTestN").Equals(GetToken()))
{
// 此处写按钮执行的具体代码
SetToken();//别忘了最后要更新Session中的标志
}
else
{
Response.Redirect(Request.RawUrl);
}
}
 

ASP.NET 使用Session,避免用户F5刷新时重复提交(转)的更多相关文章

  1. asp.net防止刷新时重复提交

    前段时间遇到了需要禁用刷新的需求,f5按钮就不说了,简单的js就能把它禁用,但是工具条上的刷新按钮却傻傻干不掉. 如果简单的在刷新时重新加载画面,通过window.location.href=&quo ...

  2. c#.net防止按F5刷新页面重复提交的方法

    在网上购物的过程中,提交完一个页面后,如果此时按f5刷新,则会弹出一个提示:如果继续,则会重新发送提交我们刚才提交的内容,这个问题应该规避掉,不然总是重复提交付款,那可不是件好事. 在c#.net中的 ...

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

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

  4. PHP避免刷新页面重复提交

    PHP避免刷新页面重复提交 2013-07-09 15:27 匿名 | 浏览 3567 次 编程语言 情景:从html提交数据到x.php 在x.php中$_POST数据写库并且显示,当x.php刷新 ...

  5. 弹出窗口Session丢失、防止表单重复提交问题

    一.弹出窗口Session丢失问题 弹出窗口Session丢失使用window.showModalDialog进行信息的提示,相当方便,也容易控制外观和布局.但是存在一个严重的问题,就是Session ...

  6. [原创]java WEB学习笔记34:Session 案例 之 解决表单重复提交

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  7. php止刷新页面重复提交

    利用session来解决,首先新建一个session,并赋值,第一次提交后改变session的值,当第二次再此提交此内容时,如果不是我们的赋值,就不在处理传过来的数据.如:<?php sessi ...

  8. 通过session 怎么防止表单的重复提交!

    1.在提交表单的时候使用隐藏域: String tokenValue=new Date().getTime(); <input type="hidden" name=&quo ...

  9. 解决 php提交表单到当前页面,刷新会重复提交 的问题

    http://blog.csdn.net/u012466451/article/details/68952280

随机推荐

  1. BZOJ 2631: tree [LCT splay区间]

    2631: tree Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 3854  Solved: 1292[Submit][Status][Discus ...

  2. 深入浅出Hadoop之mapreduce

    卿哥原创,转载请注明出处,谢谢 之前已经作出预告,那么今天就聊聊mapreduce,起源于Google的map reduce paper, 而后经历了mapreduce 1,和构建于yarn上的map ...

  3. PYTHON3 RE正则表达:

    The special characters are: "." Matches any character except a newline. "^" Matc ...

  4. JAVAEE——BOS物流项目05:OCUpload、POI、pinyin4J、重构分页代码、分区添加、combobox

    1 学习计划 1.实现区域导入功能 n OCUpload一键上传插件使用 n 将文件上传到Action n POI简介 n 使用POI解析Excel文件 n 完成数据库操作 n 使用pinyin4J生 ...

  5. yii2 源码分析Event类分析 (三)

    转载请注明链接:http://www.cnblogs.com/liuwanqiu/p/6739880.html Event是所有事件的基类,它继承Object类 Event类上面的注释的大致意思: * ...

  6. 恢复linux系统文件夹颜色

    /etc/DIR_COLORS 默认值 # Background color codes:# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta ...

  7. canvas常用api

    1. 在canvas标签中给出长宽(不带单位):<canvas width="600" height="600"></canvas> 或 ...

  8. Java String使用总结

    1 == 与 equals() 使用==来比较两个primitive主数据类型在意义上相等(是否带有相同的字节组合),或者判断两个引用(如String变量)是否引用同一个对象.使用equals()来判 ...

  9. [JSOI2008]最大数maxnumber

    [JSOI2008]最大数maxnumber 标签: 线段树 单独队列 题目链接 题解 线段树裸题. 如果一直RE可能是你用的cin/cout. Code #include<cstdio> ...

  10. img alt与title的区别

    前端 alt是图片加载不出来时候,对图片的文本替代 title 是鼠标放在图片上时,对图片的进一步说明 seo 搜索引擎对图片意思的理解主要靠 alt