首先我們新建一個類庫命名為Module,然后新建一個類命名為UrlRewriteModule 並且實現IHttpHandler接口代碼如下
public class UrlRewriteModule:IHttpModule { public void Dispose() { throw new NotImplementedException(); } public void Init(HttpApplication context) { throw new NotImplementedException(); } }
先別管Dispose方法 咱看下Init方法 重命名上來看是不是就是初始化的意思啊! 然后看它的參數HttpApplication 想想 咱有這個東西了是不是就能做點什么事了嘿嘿,廢話少說先輸出個HelloWorld吧!!!好轉到HttpApplication的定義,是不是看到有個BeginRequest的事件 public event EventHandler BeginRequest;
從單詞上來看這個事件是不是應用程序以開始最先執行的事件吧 對沒錯,好下面咱就實現應用程序一開始執行就向頁面中輸入一行文字 hello world
public class UrlRewriteModule:IHttpModule { public void Dispose() { throw newNotImplementedException(); }
public void Init(HttpApplication context) { context.BeginRequest += new EventHandler(context_BeginRequest); } void context_BeginRequest(object sender, EventArgs e) { HttpApplication app = sender as HttpApplication; app.Response.Write("hello world"); }
}
那下一步干什么呢?咱只定義了這么個類怎么讓應用程序知道它的存在呢?好下面打開web.config文件然后加入如下代碼注意在system.web節點中
<httpModules> <add name="UrlRewriteModule" type="Moduel.UrlRewriteModule"/> </httpModules>
第一個參數name 就是剛才定義的那個類名。第二個參數type就是程序集名加類名,好大功告成
行大概步驟知道了咱就實現下URL重新的功能吧!
需求:把原始的HomeDetail.aspx?Id=1 重寫成HomeDetail-1.html 是不是就是偽靜態啊 ! 差不多吧 呵呵 下面看下代碼關鍵性的幾行代碼
void context_BeginRequest(object sender, EventArgs e) { HttpApplication app = sender as HttpApplication; //app.Context.Response.Write("hahahahaa~~~"); string requestPath = app.Context.Request.FilePath; string fileName = System.IO.Path.GetFileName(requestPath); Regex reg = new Regex("HomeDetail-(\\d+).html"); Match m = reg.Match(fileName); if (m.Success) { string id = m.Groups[1].Value; app.Context.RewritePath("HomeDetail.aspx?Id=" + id); } //app.Context.Response.Write(fileName); }
首先獲得當前請求的虛擬路徑,然后獲得具體的文件名稱,通過正則表達式把Id提取出來最后重寫路徑。
HomeList.aspx 頁面做如下處理
<!-- 原始是轉向地址 --> <a href = "HomeDetail.aspx?Id=<%# Eval("Id") %>"><%#Eval("Name") %></a> <!-- 重寫后的地址地址 --> <a href = "HomeDetail-<%# Eval("Id") %>.html"><%#Eval("Name") %></a>
下面運行一下
ok 搞定,注意:關於url重寫,微軟已經為我們開發了一個組件urlrewrite 同過這個組件只需要簡單的配置一下配置文件就ok了,感興趣的可以搜一下。
感覺還沒過癮是吧 好下面再整個登陸驗證的東東
以前我們做是否登陸驗證 就是在每個需要驗證的頁面的page_load中都要判斷session的值如果為空就轉向登陸界面如果不為空繼續執行對不,好今天咱就來寫個Module來實現這么個功能讓其全應用程序有效,通過查找資料發現在HttpApplication類的17個事件中只有兩個事件能操作到session
1. AcquireRequestState 2. PostRequestHandlerExecute 今天呢咱就用第一種
首先在Module類庫里新建一個類SessionModule寫這么幾行代碼
1 class SessionModule:IHttpModule 2 { 3 4 public void Init(HttpApplication context) 5 { 6 context.AcquireRequestState += new EventHandler(context_AcquireRequestState); 7 } 8 9 void context_AcquireRequestState(object sender, EventArgs e) 10 { 11 HttpApplication app = sender as HttpApplication; 12 string requestPath = app.Request.Path; 13 string fileName = System.IO.Path.GetFileName(requestPath); 14 if (app.Context.Session["userInfo"] == null && ! fileName.Equals("login.aspx")) 15 { 16 app.Response.Redirect("login.aspx"); 17 } 18 } 19 20 21 22 23 public void Dispose() 24 { 25 throw new NotImplementedException(); 26 } 27 }
14 行 判斷session 是否為空 以及請求的頁面是否為不是登陸界面 如果都成立的話就轉向login.aspx 頁面中去就這么簡單
在web.config 文件中加入一下代碼
<httpModules> <add name="UrlRewriteModule" type="Moduel.UrlRewriteModule"/> <add name="SessionModule" type="Moduel.SessionModule"/> </httpModules>
ok 運行一下 直接進HomeList.aspx 頁面
ok 大功告成 嘿嘿
最后附上HttpAppliction 中的事件執行循序 需要的時候可以查一下
1. BeginRequest(在 ASP.NET 響應請求時作為 HTTP 執行管線鏈中的第一個事件發生)本文用到的
2. AuthenticateRequest (當安全模塊已建立用戶標識時發生。注:AuthenticateRequest 事件發出信號表示配置的身份驗證機制已對當前請求進行了身份驗證。預訂 AuthenticateRequest 事件可確保在處理附加的模塊或事件處理程序之前對請求進行身份驗證。)
3. PostAuthenticateRequest (注意:該事件在 .NET Framework 2.0 版中是新增的。 當安全模塊已建立用戶標識時發生。PostAuthenticateRequest 事件在 AuthenticateRequest 事件發生之后引發。預訂 PostAuthenticateRequest 事件的功能可以訪問由 PostAuthenticateRequest 處理的任何數據。)
4. AuthorizeRequest (當安全模塊已驗證用戶授權時發生。AuthorizeRequest 事件發出信號表示 ASP.NET 已對當前請求進行了授權。預訂 AuthorizeRequest 事件可確保在處理附加的模塊或事件處理程序之前對請求進行身份驗證和授權。)
5. PostAuthorizeRequest (.NET 2.0里新增的事件。在當前請求的用戶已獲授權時發生。PostAuthorizeRequest 事件發出信號表示 ASP.NET 已對當前請求進行了授權。預訂PostAuthorizeRequest 事件可確保在處理附加的模塊或處理程序之前對請求進行身份驗證和授權。)
6. ResolveRequestCache (當 ASP.NET 完成授權事件以使緩存模塊從緩存中為請求提供服務時發生,從而跳過事件處理程序(例如某個頁或 XML Web services)的執行。)
7. PostResolveRequestCache (在 ASP.NET 跳過當前事件處理程序的執行並允許緩存模塊滿足來自緩存的請求時發生。)在 PostResolveRequestCache 事件之后、PostMapRequestHandler 事件之前創建一個事件處理程序(對應於請求 URL 的頁)。
8. PostMapRequestHandler(在 ASP.NET 已將當前請求映射到相應的事件處理程序時發生。)
9. AcquireRequestState
10. PostAcquireRequestState
11. PreRequestHandlerExecute(執行事件處理程序。)
12. PostRequestHandlerExecute 注意:能使用到Session
13. ReleaseRequestState
14. PostReleaseRequestState (在PostReleaseRequestState 事件之后,響應篩選器(如果有)將對輸出進行篩選。)
15. UpdateRequestCache
16. PostUpdateRequestCache
17. EndRequest