如何防止使用者重複提交資料

來源:互聯網
上載者:User
資料|重複|重複提交 這篇文章從文法上看,原作者應該是從什麼地方翻譯過來的。


簡單的解決方案:
最簡單的方式就是當使用者提交之後,在你的伺服器端控制項的代碼中使用Response.Redirect("selfPage")語句。但是大多的數包括我都不使用這種方法。

多次提交:
請注意:這篇文章並不是有關如何防止在一個頁面中多次提交。這篇文章是教你在提交了請求之後如何防止頁面進行重新整理。情況是這樣的,當使用者提交了按鈕之後,終端使用者就不能再點擊提交按鈕了。但是這樣終端使用者仍然可以通過點擊瀏覽器的重新整理按鈕來提交資料。如果要防止多次提交你可以去 http://metabuilders.com/網上找一些資料,它那裡有一個提交控制項可以用。

常規的解決方案
習慣的解決方案是儲存Session的ID和當提交時ViewState中儲存的SessionID相比較來防止使用者重新整理屏螢幕。前提你的程式中允許了AutoPostBack,如果不是的話,就得在hidden field儲存這個變數了。下面給出一個典型的例子。在Page_Load事件中你儲存了第一次提交時的SessionID和一個時間戳記。
protected System.Web.UI.WebControls.Button SubmitButton;

protected System.Web.UI.WebControls.Label RefreshID;

private void Page_Load(object sender, System.EventArgs e)

{
if (RefreshID.Text.Length == 0)
{
RefreshID.Text = Session.SessionID+DateTime.Now.Ticks.ToString();
}
}


private void Button1_Click(object sender, System.EventArgs e)

{
string sesToken = (string) Session[FrameworkConst.SYNC_CONTROL_KEYWORD]; string pageToken = RefreshID.Text;
if (sesToken != null && sesToken != pageToken)
{
Response.Write("The Refresh was performed after submit.");
}
else
{
// do your processing here to avoid Refresh trap
Response.Write("The processing is done here. Disabling submit
button so that user can not perform multiple submit.");
Response.Write("But still user can peform Refresh on page.");
}

Session[FrameworkConst.SYNC_CONTROL_KEYWORD] = Session.SessionID+DateTime.Now.Ticks.ToString();
RefreshID.Text = sesToken;
SubmitButton.Enabled = false;

}

不同的解決方案:
幸運的事,asp.net提供了一些更簡單的方法。上面的解決方案的缺點是我們要在控鈕的事件中自己決定一些邏輯問題。設想一下,如果在你的解決方案中有成百個要提交的頁面,你就得寫上許多個這樣的邏輯。自訂web控制項和HTTP MOdules提供了相同的解決法。你可以將這個控制項入在你需要控制的頁面上,它就可以起作用了。當然,並不是所有的情況都需要的,比如說搜尋網頁面是允許使用者重新整理的。但是,在頁面中有插入、更新、刪除資料庫的操作時,控制重新整理按鈕是絕對有必要的。

下面來看一下上面的方案是如何工作的。
第一步:需要在System.web節中註冊HTTP Module模組。

<httpModules>

<add name="SyncHttpModule" type="EAD.Controller.SyncHttpModule, sync"/>

</httpModules>

第二步:要在控制頁的頁面內放入我們開發好的控制項。

工作原理:
它的工作原理和前面普通講的是差不多的。只是這裡提供了一個通用的方法。這裡提供了一種通用的方式。在我看來,如果你有一些好的模式,將大大的加快你的開發速度。

我們需要在第一次提交時在Session中儲存標記,並在請求時比較它們是否不同。通過HTTP handler,我們在Session中儲存標記。有這樣的一個事件PreRequestHandlerExecute 我們可以通過它找到Session,如果是其它事件的話Session是不存在的,比如BeginRequest 事件。在這個事件中比較兩者的值,如果不同則證明是Refresh事件。這時你可以添加自己的處理方法,我一般是將轉向一個頁面告訴使用者不能反覆提交。
private void OnPreRequestHandlerExecute(object source, EventArgs e)

{

HttpContext context = ((HttpApplication) source).Context;

string _keyword = FrameworkConst.SYNC_CONTROL_KEYWORD;

string sesToken = (string) context.Session[_keyword];

string reqToken = context.Request.Params[_keyword];
//如果沒有提交過,則儲存Session和標記值

if(reqToken != FrameworkConst.BYPASS_SYNC_KEYWORD)
{
context.Session[_keyword] = context.Session.SessionID+DateTime.Now.Ticks.ToString();
}
if(reqToken != null && reqToken != sesToken)
{
string path=context.Request.ApplicationPath+
&"/Common/SyncControl.aspx?returnUrl="+
&context.Request.Url.AbsolutePath;
context.Server.Transfer(path);
}
}

SyncControl 控制項將建立一個hidden input field 將在 HTTP module中設定的Session儲存起來。




相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。