今天給大家介紹兩種ASP中過濾器攔截的兩種方法。 一種是EF 的HtppModule,另一種則是靈活很多針對MVC的特性類 Attribute 具體什麼是特性類可以參考著篇文章:https://www.cnblogs.com/abc1069/p/6074171.html 在平常的練習或者項目中,整體 ...
今天給大家介紹兩種ASP中過濾器攔截的兩種方法。
一種是EF 的HtppModule,另一種則是靈活很多針對MVC的特性類 Attribute
具體什麼是特性類可以參考著篇文章:https://www.cnblogs.com/abc1069/p/6074171.html
在平常的練習或者項目中,整體運行流程都是從登錄開始吧。過濾器的主要作用就是用戶在沒有進行登錄操作情況下無法直接通過Url路徑獲取響應的數據。
過濾器顧名思義就是如此。
首先來介紹一下第一種也就是通過HttpModule的方式實現簡單的登錄攔截的功能。。。
- 創建一個普通類LoginModuleFilter,繼承IHttpModule介面,因為要實現介面裡面的方法。
具體代碼:
public void Dispose() { } /// <summary> /// 初始化 /// </summary> /// <param name="context"></param> public void Init(HttpApplication context) { //原因:AcquireRequestState 它能獲取會話信息 Session context.AcquireRequestState += Context_AcquireRequestState; }
此文章詳細的介紹了IHttpModule介面的實現方式以及具體怎麼使用:https://www.cnblogs.com/humble/p/3913078.html
在判斷用戶是否登錄時,我們可以通過Session機制來判斷用戶是否進行過登錄操作這一流程。關鍵點就是在LoginModuleFilter類中拿到Session,但是無法直接獲取,那我們該怎麼去做呢?
在IHttpModule中我們可以通過HttpModule.AcquireRequestState來獲取會話信息。並生成Context_AcquireRequestState處理事件
具體代碼:
1 private void Context_AcquireRequestState(object sender, EventArgs e) 2 { 3 //獲得應用請求 4 HttpApplication app = sender as HttpApplication; 5 //可以點到四個內置對象,拿到請求的http地址特定信息 6 HttpContext context = app.Context; 7 //獲得瀏覽器端請求的Url路徑 8 string Url = context.Request.Url.ToString(); 9 //將請求的地址轉成小寫,判斷是否包含/Home/login一段路徑,取反則不包含 10 if (Url.ToLower().Contains("css") 11 || Url.ToLower().Contains("js") 12 || Url.ToLower().Contains("jpg") 13 || Url.ToLower().Contains("png") 14 || Url.ToLower().Contains("fonts")) 15 { 16 17 } 18 else 19 { 20 if (!Url.ToLower().Contains("/home/login")) 21 { 22 //若 Session 為空 23 if (context.Session["uName"] == null) 24 { 25 //跳轉到登錄界面 26 context.Response.Redirect("/Home/Login"); 27 } 28 } 29 } 30 }
對於HttpModule,不管時運行哪一個路徑都需要在此過程進行一個判斷。。也就是判斷用戶Session是否為空,若未空,就通過重定向直接指向Home控制器下的Login方法。
第一個if條件判斷是為了賦值HttpModule將所有的Css,Js,還有一些圖片,字體圖片一併過濾。。。
這是第一種通過HttpModule的方法實現登錄攔截器功能。。。
第二種就是ASP.NET MVC 中的Filter許可權過濾器的使用。
我這裡定義了兩個類,一個是專門做攔截的特性類MyFilter1Attribute,一個是專門獲取Session並判斷是否存在的類SessionHelper
這裡我使用的是全局註冊,此方法也可以針對不同的控制器或者Action方法通過特性類標識的方式來根據不同要求進行攔截。
這種過濾攔截器方式有多種,具體怎麼去實現可以參考這篇文章:https://www.cnblogs.com/webapi/p/5669057.html
MyFilter1Attribute代碼:
這裡涉及到了MVC 中的特性類,所謂特性類簡單的來說就是在MVC中各Action方法中進行標記,類似於[HttpPost]、以及Model中的模型註解。
但是這裡需要特別註意的一點就是,使用標識有一個前提條件,那就是尾碼必須添加上Attribute,也就是存在一個命名約定。
過濾器類命名規則:名+Attribute
//MyFilter1Attribute自定義過濾器類 /// <summary> /// 過濾器類命名規則:名+Attribute /// 繼承 ActionFilterAttribute /// </summary> public class MyFilter1Attribute: System.Web.Mvc.ActionFilterAttribute { //實現介面方法 public override void OnActionExecuting(ActionExecutingContext filterContext) { //控制器名稱 string controller = filterContext.RouteData.Values["controller"].ToString(); if (controller == "Home") { base.OnActionExecuting(filterContext); return; } //調用Get方法判斷Session 為空 ? string User = SessionHelper.Get("uName"); if (string.IsNullOrEmpty(User)) { //這裡構造了一個新的ActionResult filterContext.Result = new System.Web.Mvc.RedirectResult("/Home/Login"); return; } else { base.OnActionExecuting(filterContext); return; } } }
下麵我們來解讀一下以上代碼:
首先:我自定義了一個MyFilter1Attribute過濾器類,並且讓它繼承與ActionFilterAttribute。
實現ActionFilterAttribute的方法,你可以通過F12查看具體的元數據。
根據具體要求,我們需要實現的就是在用戶直接訪問路徑之前將其攔截下來。。。
所以顧名思義,我們可以通過實現OnActionExecuting方法來做。
定義了一個控制器名稱,用來判斷用戶是否是從Home控制器進行的操作。
調用SessionHelper中的Get方法將具體的鍵“uName”傳到SessionHelper中進行判斷Session是否為空。。如果為空,則直接讓其重定向到登錄界面。
這裡需要註意的是通過 HttpContext.Current.Session來獲得會話信息。
SessionHelper代碼:
public static string Get(string uName) { if (HttpContext.Current.Session[uName] == null) { return null; } else { return HttpContext.Current.Session[uName].ToString(); } }
最後一步,就是在FilterConfig文件中進行全局的註冊
如果需要針對單個控制器或者Action方法進行攔截,那麼只需要在對應的控制器類中或者方法中進行標識就好了。例如:
這也是特性類的一大特點。
前提要記得將全局註冊的特性註釋掉。。。
以上就是實現簡單的登錄過濾器攔截的兩種方法,相比HttpModule,ASP.NET MVC 中的Filter許可權過濾器更加靈活和方便。
這是本人在初入博客園的第一篇文章,主要是為了鞏固一下學到的知識點也是方便以後可以常來看看哈哈哈哈哈.....
如果代碼或者表述有存在錯誤或者不太得當歡迎指定。。。