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

来源:https://www.cnblogs.com/hcyesdo/archive/2020/04/09/12668563.html
-Advertisement-
Play Games

今天給大家介紹兩種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的方式實現簡單的登錄攔截的功能。。。

  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許可權過濾器更加靈活和方便。

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

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

 


 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在.net環境下,基於Asp.Net Core,利用ZXing來生成二維碼的一般操作。 ...
  • Keil IDE 工具學習 前言 學習過近4年的STM32,通過正點原子的視頻還有資料入門的,裡面的資料很齊全。可是我很少去看除了視頻,原理圖,中文手冊之外的資料。但是最近翻看了一下那些資料發現了許多的寶藏,比如,CM3權威指南,Ucos-ii的講解,個人對基礎比較喜歡,所以沒有去看關於界面EmWi ...
  • Debian 10.3 下載地址: "http://mirrors.163.com/debian cd/10.3.0 live/amd64/iso hybrid/debian live 10.3.0 amd64 standard.iso" 備份 更換 輸入以下內容: 註意許可權問題,否則可能編輯不了此 ...
  • 對於varninsh來講,緩存項修剪也叫緩存項刪除;我們在varnish伺服器上可以通過vcl語言來編寫緩存策略,對於某些緩存該如何緩存,緩存多久等等;假如我們在定義好緩存策略後,在定義緩存過期時間內,後端伺服器內容發生了變化,或者後端伺服器發生了內容更新,我們如果不把varnish上的緩存修剪掉... ...
  • 1、文件屬性 文件屬性是指: 文件的大小,創建時間,類型,許可權,屬組等。 文件的屬性總共10列 第一列 是文件的唯一標識,也稱之為 inode(節點)號 第二列 第一個字元 是指文件類型 \ 是代表文件類型為普通文件 (用f表示) d 是代表文件類型為目錄 (用d表示) l 是代表文件類型為連接文件 ...
  • 轉載:https://www.cnblogs.com/irockcode/p/7044722.html NR,表示awk開始執行程式後所讀取的數據行數. FNR,與NR功用類似,不同的是awk每打開一個新文件,FNR便從0重新累計. 下麵看兩個例子: 1,對於單個文件NR 和FNR 的 輸出結果一樣 ...
  • alias 功能固然好用,但在快捷方便的同時,隱藏了原始命令的結節。久而久之,不記得原始命令是什麼了,因些,我想到了實現原命令輸出,以作為提示。先看效果圖吧。 /etc/bash.bashrc 文件追加代碼如下: ### 開始自定義 ### #環境變數 PROGRAMS=/usr/local PHP ...
  • 記憶體映射 Linux 內核給每個進程都提供了一個獨立的虛擬地址空間,並且這個地址空間是連續的。這樣,進程就可以很方便地訪問記憶體,更確切地說是訪問虛擬記憶體。 虛擬地址空間的內部又被分為內核空間和用戶空間兩部分,不同字長(也就是單個 CPU 指令可以處理數據的最大長度)的處理器,地址空間的範圍也不同。比 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...