ASP.NET過濾器的應用方法介紹

來源:互聯網
上載者:User
在J2EE Web開發中有過濾器filter,該filter可以對指定的URL訪問進行攔截,並執行過濾器的方法,根據實際應用情況,在過濾器中修改請求的代碼、判斷會話資訊,也可以做許可權控制,總之這個過濾器是非常有意義的,也可以說是責任鏈設計模式在J2EE中的一個應用。

那麼在ASP.NET中是否也可以定義這樣的過濾器結構,並在過濾器中進行相應的邏輯操作呢?答案是肯定,本文將告訴你如果編寫一個過濾器,又如何配置到IIS的Web應用之中。

過程一:如何編寫過濾器

編寫過濾器,其實就是編寫一個過濾器的類,也就是編寫一個HttpModule模組,這個過濾器應該實現IHttpModule基類,並重寫Init方法,給你一個實際的例子如下:

這是一個PageFilter.cs

using System;using System.Web;using System.Web.SessionState;using System.Collections.Generic;using System.Collections;using System.Text;using System.IO;public class PageFilter: IHttpModule{        public String ModuleName        {            get { return "PageFilter"; }        }        //在 Init 方法中註冊HttpApplication         // 通過委託方式註冊事件        public void Init(HttpApplication application)        {            application.AcquireRequestState += new EventHandler(Application_AcquireRequestState);                    }  private void Application_AcquireRequestState(Object source, EventArgs e)        {            HttpApplication application = (HttpApplication)source;            HttpContext context = application.Context;            HttpSessionState session = context.Session;            HttpRequest request = context.Request;            HttpResponse response = context.Response;            String contextPath = request.ApplicationPath;        }}

需要說明的是,“過濾器”也可以稱為是“攔截器”,即攔截整個HTTP請求/響應的過程,因為整個請求/響應過程可以分為許多個階段,那麼這裡面就會涉及到一個問題,也就是你的過濾器想攔截具體的哪一個階段,上面的Init函數中,可以自己定義想攔截的具體階段,例如上面攔截是產生請求會話的階段,AcquireRequestStat是這個狀態的代表,而攔截後對應的處理函數為Application_AcquireRequestState,所以下面定義了一個Application_AcquireRequestState方法,在該方法中可以通過強制類型轉換獲得application、context、session、request、response等一系列對象,在獲得這些對象的基礎上,你就可以進行核心商務邏輯的編寫了,例如獲得判斷當前URL訪問是否合法,檢查當前訪問是否為登入後使用者的訪問等等。


另外既然有攔截的整個過程有許多階段,那麼如何攔截其它的階段呢?這個應該很簡單了,與上面類似在Init中按如下邏輯定義即可:

application.階段的標準名稱1 += new EventHandler(該階段對應的處理方法名稱1);
application.階段的標準名稱2 += new EventHandler(該階段對應的處理方法名稱2);
。。。

階段的標準名稱,是說這些階段是有標準的名稱的,而且是application對象的標準屬性,例如上面AcquireRequestState,還有諸如BeginRequest、AuthenticateRequest、AuthorizeRequest、ResolveRequestCache、AcquireRequestState、PreRequestHandlerExecute、PostRequestHandlerExecute、ReleaseRequestState、UpdateRequestCache、EndRequest許多階段等等,這些階段都有特定的含義.

該階段對應的處理方法名稱,其實就是你自己定義對應這個階段處理的方法,上面已有範例,不再多解釋。

還有一點需要特別注意,有那麼多階段可以攔截,但是實際應用中,我們攔截的往往也就一兩個階段,而且要注意有些伺服器對象只有在特定的階段才可以攔截到,例如Session對象在BeginRequest階段中是沒有的,在AcquireRequestState及其以後階段中是有的,因此要根據實際需求來攔截具體的階段,這個是新手最容易遇到的問題。

過程二:如何配置過濾

我們編寫好了一個.cs檔案的過濾器,那麼如何讓這個過濾器起作用呢,這個需要進行配置,預設肯定是不會攔截的,你需要將該過濾器配置到應用的Web.config檔案之中,上述範例的配置如下:

<configuration><system.web> <httpModules>   <add name="pageModule" type="PageFilter"/> </httpModules></system.web></configuration>

這樣其實就配置好了,然後發布網站產生dll等就可以了,到時後會自動攔截URL訪問的,不過要記住一點,預設情況下對於該應用的所有請求都會被攔截,如果你指向攔截特定的請求,例如想只對aspx檔案的請求進行攔截,那麼可以在過濾器邏輯中加入對檔案尾碼名的判斷,如果不是aspx的直接放過即可

相關文章

聯繫我們

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

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

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.