ASP.NET過濾器的應(yīng)用方法介紹
在J2EE Web開發(fā)中有過濾器filter,該filter可以對(duì)指定的URL訪問進(jìn)行攔截,并執(zhí)行過濾器的方法,根據(jù)實(shí)際應(yīng)用情況,在過濾器中修改請(qǐng)求的代碼、判斷會(huì)話信息,也可以做權(quán)限控制,總之這個(gè)過濾器是非常有意義的,也可以說是責(zé)任鏈設(shè)計(jì)模式在J2EE中的一個(gè)應(yīng)用。
那么在ASP.NET中是否也可以定義這樣的過濾器結(jié)構(gòu),并在過濾器中進(jìn)行相應(yīng)的邏輯操作呢?答案是肯定,本文將告訴你如果編寫一個(gè)過濾器,又如何配置到IIS的Web應(yīng)用之中。
過程一:如何編寫過濾器
編寫過濾器,其實(shí)就是編寫一個(gè)過濾器的類,也就是編寫一個(gè)HttpModule模塊,這個(gè)過濾器應(yīng)該實(shí)現(xiàn)IHttpModule基類,并重寫Init方法,給你一個(gè)實(shí)際的例子如下:
這是一個(gè)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 方法中注冊(cè)HttpApplication
// 通過委托方式注冊(cè)事件
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;
}
}
需要說明的是,“過濾器”也可以稱為是“攔截器”,即攔截整個(gè)HTTP請(qǐng)求/響應(yīng)的過程,因?yàn)檎麄€(gè)請(qǐng)求/響應(yīng)過程可以分為許多個(gè)階段,那么這里面就會(huì)涉及到一個(gè)問題,也就是你的過濾器想攔截具體的哪一個(gè)階段,上面的Init函數(shù)中,可以自己定義想攔截的具體階段,例如上面攔截是產(chǎn)生請(qǐng)求會(huì)話的階段,AcquireRequestStat是這個(gè)狀態(tài)的代表,而攔截后對(duì)應(yīng)的處理函數(shù)為Application_AcquireRequestState,所以下面定義了一個(gè)Application_AcquireRequestState方法,在該方法中可以通過強(qiáng)制類型轉(zhuǎn)換獲得application、context、session、request、response等一系列對(duì)象,在獲得這些對(duì)象的基礎(chǔ)上,你就可以進(jìn)行核心業(yè)務(wù)邏輯的編寫了,例如獲得判斷當(dāng)前URL訪問是否合法,檢查當(dāng)前訪問是否為登錄后用戶的訪問等等。
另外既然有攔截的整個(gè)過程有許多階段,那么如何攔截其它的階段呢?這個(gè)應(yīng)該很簡(jiǎn)單了,與上面類似在Init中按如下邏輯定義即可:
application.階段的標(biāo)準(zhǔn)名稱1 += new EventHandler(該階段對(duì)應(yīng)的處理方法名稱1);
application.階段的標(biāo)準(zhǔn)名稱2 += new EventHandler(該階段對(duì)應(yīng)的處理方法名稱2);
。。。
階段的標(biāo)準(zhǔn)名稱,是說這些階段是有標(biāo)準(zhǔn)的名稱的,而且是application對(duì)象的標(biāo)準(zhǔn)屬性,例如上面AcquireRequestState,還有諸如BeginRequest、AuthenticateRequest、AuthorizeRequest、ResolveRequestCache、AcquireRequestState、PreRequestHandlerExecute、PostRequestHandlerExecute、ReleaseRequestState、UpdateRequestCache、EndRequest許多階段等等,這些階段都有特定的含義.
該階段對(duì)應(yīng)的處理方法名稱,其實(shí)就是你自己定義對(duì)應(yīng)這個(gè)階段處理的方法,上面已有樣例,不再多解釋。
還有一點(diǎn)需要特別注意,有那么多階段可以攔截,但是實(shí)際應(yīng)用中,我們攔截的往往也就一兩個(gè)階段,而且要注意有些服務(wù)器對(duì)象只有在特定的階段才可以攔截到,例如Session對(duì)象在BeginRequest階段中是沒有的,在AcquireRequestState及其以后階段中是有的,因此要根據(jù)實(shí)際需求來攔截具體的階段,這個(gè)是新手最容易遇到的問題。
過程二:如何配置過濾
我們編寫好了一個(gè).cs文件的過濾器,那么如何讓這個(gè)過濾器起作用呢,這個(gè)需要進(jìn)行配置,默認(rèn)肯定是不會(huì)攔截的,你需要將該過濾器配置到應(yīng)用的Web.config文件之中,上述樣例的配置如下:
<configuration>
<system.web>
<httpModules>
<add name="pageModule" type="PageFilter"/>
</httpModules>
</system.web>
</configuration>
這樣其實(shí)就配置好了,然后發(fā)布網(wǎng)站生成dll等就可以了,到時(shí)后會(huì)自動(dòng)攔截URL訪問的,不過要記住一點(diǎn),默認(rèn)情況下對(duì)于該應(yīng)用的所有請(qǐng)求都會(huì)被攔截,如果你指向攔截特定的請(qǐng)求,例如想只對(duì)aspx文件的請(qǐng)求進(jìn)行攔截,那么可以在過濾器邏輯中加入對(duì)文件后綴名的判斷,如果不是aspx的直接放過即可
相關(guān)文章
ASP.NET2.0服務(wù)器控件之自定義狀態(tài)管理
ASP.NET2.0服務(wù)器控件之自定義狀態(tài)管理...2006-09-09
Linq to SQL Delete時(shí)遇到問題的解決方法
在Linq to SQL中要?jiǎng)h除一行記錄,官方的例子教我這樣做2008-03-03
c# 連接字符串?dāng)?shù)據(jù)庫(kù)服務(wù)器端口號(hào) .net狀態(tài)服務(wù)器端口號(hào)
正常的數(shù)據(jù)庫(kù)連接字符串配置,這是在MSSQL服務(wù)器端口是1433(默認(rèn))的情況下。2009-06-06
asp.net 簡(jiǎn)單單點(diǎn)登錄技術(shù)分析
單點(diǎn)登錄,又叫SSO(Single Sign On)。在一些cms或者OA中比較常用到這種登錄模式,目的是為防止重復(fù)登錄。而其實(shí)現(xiàn)原理也頗為簡(jiǎn)單,只要Cache的形式就可以實(shí)現(xiàn),這里只用于簡(jiǎn)單記錄下,呵呵……2011-02-02
JQuery實(shí)現(xiàn)Repeater無(wú)刷新批量刪除(附后臺(tái)asp.net源碼)
JQuery實(shí)現(xiàn)Repeater無(wú)刷新批量刪除(附后臺(tái)asp.net源碼) ,學(xué)習(xí)jquery的朋友可以參考下。2011-09-09
C#實(shí)現(xiàn)HTTP協(xié)議迷你服務(wù)器(兩種方法)
用C#語(yǔ)言實(shí)現(xiàn)HTTP協(xié)議的服務(wù)器類本文將以兩種稍微有差別的方式用C#語(yǔ)言實(shí)現(xiàn);要完成高性能的Web服務(wù)功能,通常都是需要寫入到服務(wù),如IIS,Apache Tomcat感興趣的朋友可以了解下,或許對(duì)你學(xué)習(xí)c#有所幫助2013-02-02
.NET Core 2.0如何生成圖片驗(yàn)證碼完整實(shí)例
這篇文章主要給大家介紹了關(guān)于.NET Core 2.0如何生成圖片驗(yàn)證碼的相關(guān)資料,該功能主要是利用ZKWeb.System.Drawing來實(shí)現(xiàn),文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07

