Asp.net下使用HttpModule模擬Filter,實現許可權控制

雲霏霏發表於2014-04-29

  在asp.net中,我們為了防止使用者直接從Url中訪問指定的頁面而繞過登入驗證,需要給每個頁面加上驗證,或者是在模板頁中加上驗證。如果說專案比較大的話,新增驗證是一件令人抓狂的事情,本次,我就跟大家分享一個利用HttpModule實現許可權驗證的方法。

第一步:

在專案中新建一個類.cs檔案,本例為Filter,應用一下名稱空間,主要是為了訪問Session。

using System.Web.SessionState;

第二步:讓這個類繼承IHttpModel和IRequiresSessionState介面,程式碼如下:

public class Filter : IHttpModule, IRequiresSessionState
{
}

第三步:實現Ihttpmodel介面的一下兩個方法:

public void Dispose()
{
            
}
public void Init(HttpApplication context)
{
}

第四步:編寫方法context_AcquireRequestState,實現許可權的認證,程式碼如下:

void context_AcquireRequestState(object sender, EventArgs e)
        {

            HttpApplication application = (HttpApplication)sender;
            HttpContext context = application.Context;
            
            try
            {
                string path = context.Request.Path;
                if (context.Session != null && context.Session["User"] == null )
                {
                    context.Response.Redirect("~/Default.aspx");
                }

            }
            catch (Exception)
            {
                context.Response.Write("系統出現錯誤,請稍後訪問......");
            }

        }

第五步:註冊AcquireRequestState方法:

public void Init(HttpApplication context)
        {
            context.AcquireRequestState += new EventHandler(context_AcquireRequestState);
        }

至此,這個許可權認證就完成啦~~

注意事項:不能使用BeginRequest這個方法,BeginRequest方法無法訪問Session,會出現錯誤。具體為什麼,還請高手解釋。

HttpModel的事件及執行順序如下:

        AcquireRequestState 當ASP.NET執行時準備好接收當前HTTP請求的對話狀態的時候引發這個事件。
        AuthenticateRequest 當ASP.NET 執行時準備驗證使用者身份的時候引發這個事件。
        AuthorizeRequest 當ASP.NET執行時準備授權使用者訪問資源的時候引發這個事件。
        BeginRequest 當ASP.NET執行時接收到新的HTTP請求的時候引發這個事件。
        Disposed 當ASP.NET完成HTTP請求的處理過程時引發這個事件。
        EndRequest 把響應內容傳送到客戶端之前引發這個事件。
        Error 在處理HTTP請求的過程中出現未處理異常的時候引發這個事件。
        PostRequestHandlerExecute 在HTTP處理程式結束執行的時候引發這個事件。
        PreRequestHandlerExecute 在ASP.NET開始執行HTTP請求的處理程式之前引發這個事件。在這個事件之後,ASP.NET 把該請求轉發給適當的HTTP處理程式。
        PreSendRequestContent 在ASP.NET把響應內容傳送到客戶端之前引發這個事件。這個事件允許我們在內容到達客戶端之前改變響應內容。我們可以使用這個事件給頁面輸出新增用於所有頁面的內容。例如通用選單、頭資訊或腳資訊。
        PreSendRequestHeaders 在ASP.NET把HTTP響應頭資訊傳送給客戶端之前引發這個事件。在頭資訊到達客戶端之前,這個事件允許我們改變它的內容。我們可以使用這個事件在頭資訊中新增cookie和自定義資料。
        ReleaseRequestState 當ASP.NET結束所搜有的請求處理程式執行的時候引發這個事件。
        ResolveRequestCache 我們引發這個事件來決定是否可以使用從輸出緩衝返回的內容來結束請求。這依賴於Web應用程式的輸出緩衝時怎樣設定的。
        UpdateRequestCache 當ASP.NET完成了當前的HTTP請求的處理,並且輸出內容已經準備好新增給輸出緩衝的時候,引發這個事件。這依賴於Web應用程式的輸出緩衝是如何設定的。

 

相關文章