사용자가 브라우저의 새로고침(Refresh)를 선택은 double-posting를 발생시킨다. 이는 응용프로그램이 예측하지 못한 행위야기 하기도 한다. 이러한 현상을 어떻게 방지할 수 있는지 살펴본다.
HTTP모듈을 사용하는 방법이 아니지만 다른 방법은 이전 글에서 설명하였다.
아래 내용은 HTTP모듈을 구현한 일부분이다.
using System;
using System.Collections;
using System.IO;
using System.Web;
namespace CslSoft.Web
{
public class RefreshModule : IHttpModule
{
private HttpApplication _application;
// 요청 정보를 담고있는 컬랙션이다.
// 이 컬랙션을 처리하는 필터가 필요할 것이다.
// 클래스명:ResponseFilter
private static ArrayList AllowUrls = new ArrayList();
public void Init(HttpApplication app)
{
app.AcquireRequestState +=
new EventHandler(this.OnAcquireRequestState);
}
public void OnAcquireRequestState(object source, EventArgs e)
{
this._application = (HttpApplication)source;
// AllowUrls 컬랙션에 URL값이 포함되어 있다면
if(this.IsEnabled())
{
//새로고침 버튼이 선택되었는지 감시한다.
if(this.IsDetectedRefresh())
{
// 새로고침으로 인한 현상에 대한 메시지를 전달
this.OnDetectedRefresh();
}
}
}
private bool IsEnabled()
{
return RefreshModule.AllowUrls.Contains
(this._application.Request.Url.AbsolutePath);
}
//새로고침 현상 감시한다.
private bool IsDetectedReresh()
{
}
public virtual void OnDetectedRefresh()
{
}
// 모든 페이지에 대한 새로고침을 방지하는 것은 별다른 의미가 없을 것이다.
// 따라서 특정 페이지에서만 새로고침을 방지하는 것이 보다 효과적일 것이다.
public static void EnableProtection(string url)
{
}
//어떤 페이지에서 새로고침 현상을 감지할 필요가 없을 때 사용한다.
public static void DisableProtection(string url)
{
}
}
internal class ResponseFilter : Stream
{
internal ResponseFilter(Stream inputStream, string sessionKey)
{
}
}
}
web.config 파일에
<httpModules>
<add name="protectionR" type="CslSoft.Web.RefreshModule,CslSoft.Web"/>
</httpModules>
처럼 설정해 준다.
'.net' 카테고리의 다른 글
사용자의 새로고침(F5) 캡쳐하기 (0) | 2007.05.03 |
---|---|
URL Rewriting in ASP.NET (6) | 2007.05.03 |
데이터 바인딩 기본 (0) | 2007.05.03 |
ASP.NET 캐시 (0) | 2007.05.03 |
GET, POST, Multipart/form-data의 처리 (1) | 2007.05.03 |