.NET MVC中登錄過濾器攔截的兩種方法


今天給大家介紹兩種ASP中過濾器攔截的兩種方法。

一種是EF 的HtppModule,另一種則是靈活很多針對MVC的特性類 Attribute

具體什么是特性類可以參考着篇文章:https://www.cnblogs.com/abc1069/p/6074171.html

在平常的練習或者項目中,整體運行流程都是從登錄開始吧。過濾器的主要作用就是用戶在沒有進行登錄操作情況下無法直接通過Url路徑獲取響應的數據。

過濾器顧名思義就是如此。

首先來介紹一下第一種也就是通過HttpModule的方式實現簡單的登錄攔截的功能。。。

  1. 創建一個普通類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權限過濾器更加靈活和方便。

這是本人在初入博客園的第一篇文章,主要是為了鞏固一下學到的知識點也是方便以后可以常來看看哈哈哈哈哈.....

如果代碼或者表述有存在錯誤或者不太得當歡迎指定。。。

 

 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM