• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > ASP.NET中防止页面刷新造成表单重复提交执行两次操作

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

作者:冰危节奏 字体:[增加 减小] 来源:互联网 时间:2017-05-11

冰危节奏通过本文主要向大家介绍了自定义表单 asp.net,页面跳转 asp.net,阐述asp.net页面模型,asp.net,asp net培训等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

之前看过别人防刷新的方法,是让页面刷新或返回上一步让页面过期,这里介绍一种另类的方法,使用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>
</div>

需要注意的地方:

  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;
    }
  }
}
</div>

需要注意的地方:

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

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • asp.net动态生成HTML表单的方法
  • asp.net DataTable导出Excel自定义列名的方法
  • 基于ASP.NET+EasyUI框架实现图片上传提交表单功能(js提交图片)
  • 基于ASP.NET+easyUI框架实现图片上传功能(表单)
  • Asp.net自定义控件之单选、多选控件
  • Asp.net自定义控件之加载层
  • 在ASP.NET 2.0中操作数据之二十六:排序自定义分页数据
  • 在ASP.NET 2.0中操作数据之十一:基于数据的自定义格式化
  • ASP.NET中防止页面刷新造成表单重复提交执行两次操作
  • asp.net实现取消页面表单内文本输入框Enter响应的方法

相关文章

  • 2018-08-20.Net Core使用OpenXML导出、导入Excel
  • 2017-05-11asp.net 使用Response.Filter 过滤非法词汇
  • 2017-05-11详解ASP.NET七大身份验证方式以及解决方案
  • 2017-05-11ABP框架中导航菜单的使用及JavaScript API获取菜单的方法
  • 2017-05-11自写一个模仿Dictionary与Foreach的实现及心得总结
  • 2017-05-11asp.net 选择excel类型文件,利用Dos命令成批复制文件
  • 2018-08-20.NET Core如何获取操作系统中的各种信息
  • 2017-05-11ASP.NET实现电影票信息的增删查改功能
  • 2018-08-20IIS实现反向代理时Cookie域的设置方法
  • 2017-05-11C# 生成验证码取随机数字加字母(改进版)

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • ASP.Net刷新页面后自动滚动到原来位置方法汇总
    • 在ASP.NET 2.0中操作数据之六十二:GridView批量更新数据
    • .net设计模式之装饰模式(Decorator)
    • 集合类Array List HashTable实例操作练习
    • 深入Lumisoft.NET组件与.NET API实现邮件发送功能的对比分析
    • .NET简单工厂模式讲解
    • asp.net 数据访问层 存储过程分页语句
    • asp.net 处理原文件中过长的viewstate代码
    • .NET Core系列之MemoryCache 缓存过期
    • ASP.NET GridView的Bootstrap分页样式

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有