ASP.NET에서 페이지 새로 고침을 방지하여 양식 중복 제출

4125 단어 asp.net리셋커밋
웹 개발에서 반드시 직면해야 할 문제는 바로 표의 중복 제출 문제이다(이곳은 F5 리셋으로 인한 중복 제출만 가리킨다).NET에서 이 문제를 처리하는 데는 좋은 방법이 없는 것 같다.인터넷에서 검색한 해결 방법은 주로 두 가지가 있는데 하나는 바로 폼 단추를 효력을 상실시켜 한 사용자가 한 폼에 대해 한 번만 제출할 수 있도록 하는 것이다.또 다른 방법은 한 번 제출한 후에 표를 비우고 백엔드 논리적으로 판단하여 중복 제출 여부를 구분하는 것이다.개인적인 느낌에 따르면 첫 번째 방법은 사용자의 체험이 좋지 않아 버튼을 한 번만 누를 수 있다. 이런 것은 제출 버튼을 여러 번 눌러서 발생하는 중복 제출을 예방하는 데 사용되고 리셋으로 인한 2차 제출을 방지할 수 없다.두 번째, 두 가지 중복 제출은 모두 방지할 수 있지만 표의 내용이 없어지고 만약에 수요가 있어 내용이 사라지지 않도록 하려면 우여곡절이 필요하다.그래서 JSP에서 Struts의 영패를 본떠서 폼이 중복 제출되지 않도록 하는 방법을 써서 여러분과 공유했습니다.실현 원리: 제출 폼을 새로 고침하기 때문에 실제적으로 제출한 것이 바로 지난번에 정상적으로 제출한 폼이기 때문에 우리는 표지를 하나 만들어서 새로운 폼인지 지난번의 낡은 폼인지 판단하면 중복 제출 작업이 진행되었는지 분별할 수 있다.실현 방법: 페이지에 Hidden 필드를 놓고 페이지를 처음 불러올 때Session에 로고를 저장하고 이 로고를 페이지의 Hidden에 저장합니다.양식을 제출할 때 양식에 제출된 Hidden과 Session의 로고가 일치하는지 판단하면 양식을 정상적으로 제출했는지, 페이지를 새로 고쳐 중복 제출했는지를 알 수 있다.주의해야 할 것은 매번 폼을 제출한 후에 세션의 로고를 업데이트해야 한다는 것이다.코드 실례: 코드가 매우 적습니다. 우선 페이지에 있습니다.
<html xmlns="http://www.w3.org/1999/xhtml" >
<head 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 GetSessionToken() 함수는 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;
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 로고 저는 현재Session ID에 현재 시간 밀리초 값을 사용했습니다. 이렇게 하면 로고가 중복되는 것을 피할 수 있습니다. 그 다음에 MD5를 한 번 진행했습니다. 순전히 로고를 짧게 하기 위해서입니다. 물론 조금은 안전하다는 뜻이 있습니다. 하하.
원문:http://www.cnblogs.com/binaryworms/articles/2207028.html

좋은 웹페이지 즐겨찾기