ASP.NET中防止頁面刷新造成表單重復(fù)提交執(zhí)行兩次操作
來源:易賢網(wǎng) 閱讀:1267 次 日期:2016-08-10 15:09:42
溫馨提示:易賢網(wǎng)小編為您整理了“ASP.NET中防止頁面刷新造成表單重復(fù)提交執(zhí)行兩次操作”,方便廣大網(wǎng)友查閱!

之前看過別人防刷新的方法,是讓頁面刷新或返回上一步讓頁面過期,這里介紹一種另類的方法,使用Session來處理。

實現(xiàn)原理:

由于刷新提交表單,實際上提交的就是上一次正常提交的表單,所以我們只要做一個標(biāo)志,判斷出是新表單還是上一次的舊表單就可以分辨出是否進(jìn)行了重復(fù)提交操作。

實現(xiàn)方法:

在頁面上放置一個Hidden域,當(dāng)頁面第一次載入的時候,在Session里面保存一個標(biāo)志,同時,把這個標(biāo)志保存到頁面上的Hidden里面。在提交表單時,判斷表單中提交上來的Hidden和Session中的標(biāo)志是否一致,就可以知道是正常的提交表單,還是刷新頁面導(dǎo)致的重復(fù)提交。需要注意的是,在每次提交表單的處理之后,要更新Session里面的標(biāo)志。

代碼實例:代碼很少,首先是頁面上。

<%@ 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()函數(shù)是為了獲得 Session里面保存的標(biāo)志。

2 Hidden使用了非服務(wù)器控件,這是因為我使用服務(wù)器控件,并在后臺直接獲取Session的標(biāo)志并賦值給這個Hidden的時候,刷新提交到服務(wù)器的 表單中的Hidden的值也發(fā)生了改變,猜想是服務(wù)器控件的話,表單里面的值是保持同步的,當(dāng)然,也可能是我用的方法不對,嘎嘎。

下面是后臺代碼:

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)

    {

      //第一次載入的時候,生成一個初始的標(biāo)志

      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中的標(biāo)志

      }

      else

      {

        lblMessage.ForeColor = System.Drawing.Color.Red;

        lblMessage.Text = "刷新提交表單";

      }

    }

    //獲得當(dāng)前Session里保存的標(biāo)志

    public string GetToken()

    {

      if (null != Session["Token"])

      {

        return Session["Token"].ToString();

      }

      else

      {

        return string.Empty;

      }

    }

    //生成標(biāo)志,并保存到Session

    private void SetToken()

    {

      Session.Add("Token", UserMd5(Session.SessionID + DateTime.Now.Ticks.ToString()));

    }

    //這個函數(shù)純粹是為了讓標(biāo)志稍微短點兒,一堆亂碼還特有神秘感,另外,這個UserMd5函數(shù)是網(wǎng)上找來的現(xiàn)成兒的

    protected string UserMd5(string str1)

    {

      string cl1 = str1;

      string pwd = "";

      MD5 md5 = MD5.Create();

      // 加密后是一個字節(jié)類型的數(shù)組

      byte[] s = md5.ComputeHash(Encoding.Unicode.GetBytes(cl1));

      // 通過使用循環(huán),將字節(jié)類型的數(shù)組轉(zhuǎn)換為字符串,此字符串 是常規(guī)字符格式化所得

      for (int i = 0; i < s.Length; i++)

      {

        // 將得到的字符串使用十六進(jìn)制類型格式。格式后的字符是 小寫的字母,如果使用大寫(X)則格式后的字符是大寫字符

        pwd = pwd + s[i].ToString("X");

      }

      return pwd;

    }

  }

}

需要注意的地方:

1 在頁面第一次載入的時候要生成標(biāo)志,以后就不用了。

2 在表單處理的函數(shù)的最后,記得要更新標(biāo)志。

3 標(biāo)志我選用了當(dāng)前SessionID加上當(dāng)前時間毫秒值,這樣基本可以避免標(biāo)志重復(fù),之后進(jìn)行了一次MD5,純粹為了讓標(biāo)志短點兒,當(dāng)然有一點點安全的意 思,哈哈。

所有代碼就是這些,很簡單,不知道是因為太簡單還是大家有更好的方法,我在網(wǎng)上沒有找到類似的代碼,所以寫下來和大家分享,如果有更好的方法,希望可以告訴我,因為好久不做Web開發(fā)了,怕是有很多新技術(shù)都不會了。

更多信息請查看網(wǎng)絡(luò)編程
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 加入群交流 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65317125(9:00—18:00) 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
咨詢QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報警專用圖標(biāo)