사용자가 브라우저의 새로고침(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

+ Recent posts