最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

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

来源:动视网 责编:小采 时间:2020-11-27 22:37:54
文档

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

ASP.NET中防止页面刷新造成表单重复提交执行两次操作:之前看过别人防刷新的方法,是让页面刷新或返回上一步让页面过期,这里介绍一种另类的方法,使用Session来处理。 实现原理: 由于刷新提交表单,实际上提交的就是上一次正常提交的表单,所以我们只要做一个标志,判断出是新表单还是上一次的旧表单就可以分辨
推荐度:
导读ASP.NET中防止页面刷新造成表单重复提交执行两次操作:之前看过别人防刷新的方法,是让页面刷新或返回上一步让页面过期,这里介绍一种另类的方法,使用Session来处理。 实现原理: 由于刷新提交表单,实际上提交的就是上一次正常提交的表单,所以我们只要做一个标志,判断出是新表单还是上一次的旧表单就可以分辨


之前看过别人防刷新的方法,是让页面刷新或返回上一步让页面过期,这里介绍一种另类的方法,使用Session来处理。

实现原理:

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

实现方法:

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

代码实例:代码很少,首先是页面上。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Test.Web.Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
 <title></title>
</head>
<body>
 <form id="form1" runat="server">
 <div>
 <input type="text" id="tbxName" runat="server" />
 <input type="text" id="tbxPass" value="" runat="server" />
 <asp:Button ID="btnSubmit" runat="server" OnClick="Button1_Click" Text="Button" />
 <asp:Label ID="lblMessage" runat="server" Text=""></asp:Label>
 <input id="hiddenTest" type="hidden" value="<%= GetToken() %>" name="hiddenTestN" />
 </div>
 </form>
</body>
</html>

需要注意的地方:

  1 GetToken()函数是为了获得 Session里面保存的标志。
  2 Hidden使用了非服务器控件,这是因为我使用服务器控件,并在后台直接获取Session的标志并赋值给这个Hidden的时候,刷新提交到服务器的 表单中的Hidden的值也发生了改变,猜想是服务器控件的话,表单里面的值是保持同步的,当然,也可能是我用的方法不对,嘎嘎。

下面是后台代码:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Security.Cryptography;
using System.Text;

namespace Test.Web
{

 public partial class Default : System.Web.UI.Page
 {
 protected void Page_Load(object sender, EventArgs e)
 {
 //第一次载入的时候,生成一个初始的标志
 if (null == Session["Token"])
 {
 SetToken();
 }
 }
 protected void Button1_Click(object sender, EventArgs e)
 {
 if (Request.Form.Get("hiddenTestN").Equals(GetToken()))
 {
 lblMessage.ForeColor = System.Drawing.Color.Blue;
 lblMessage.Text = "正常提交表单";
 SetToken();//别忘了最后要更新Session中的标志
 }
 else
 {
 lblMessage.ForeColor = System.Drawing.Color.Red;
 lblMessage.Text = "刷新提交表单";
 }
 }
 //获得当前Session里保存的标志
 public string GetToken()
 {
 if (null != Session["Token"])
 {
 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 = 0; i < s.Length; i++)
 {
 // 将得到的字符串使用十六进制类型格式。格式后的字符是 小写的字母,如果使用大写(X)则格式后的字符是大写字符
 pwd = pwd + s[i].ToString("X");
 }
 return pwd;
 }
 }
}

需要注意的地方:

    1 在页面第一次载入的时候要生成标志,以后就不用了。
    2 在表单处理的函数的最后,记得要更新标志。
    3 标志我选用了当前SessionID加上当前时间毫秒值,这样基本可以避免标志重复,之后进行了一次MD5,纯粹为了让标志短点儿,当然有一点点安全的意 思,哈哈。
所有代码就是这些,很简单,不知道是因为太简单还是大家有更好的方法,我在网上没有找到类似的代码,所以写下来和大家分享,如果有更好的方法,希望可以告诉我,因为好久不做Web开发了,怕是有很多新技术都不会了。

文档

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

ASP.NET中防止页面刷新造成表单重复提交执行两次操作:之前看过别人防刷新的方法,是让页面刷新或返回上一步让页面过期,这里介绍一种另类的方法,使用Session来处理。 实现原理: 由于刷新提交表单,实际上提交的就是上一次正常提交的表单,所以我们只要做一个标志,判断出是新表单还是上一次的旧表单就可以分辨
推荐度:
标签: 操作 刷新 提交
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top