ASP.NET MVC Filter過濾機制(過濾器、攔截器)

https://blog.csdn.net/knqiufan/article/details/82413885

本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/knqiufan/article/details/82413885參考文章:1、https://www.cnblogs.com/webapi/p/5669057.html
? ? ? ? ? ? ? ? ? 2、https://shiyousan.com/post/635835285087587126
在MVC中有一個過濾機制,可以編寫為過濾器或攔截器,用于對在某個Action執行前后再執行的動作。
過濾器繼承自ActionFilterAttribute類(命名空間是System.Web.Mvc)


ActionFilterAttribute類是一個特性類。
在菜鳥教程中,對特性是這么描述的:(鏈接:http://www.runoob.com/csharp/csharp-attribute.html)
特性(Attribute)是用于在運行時傳遞程序中各種元素(比如類、方法、結構、枚舉、組件等)的行為信息的聲明性標簽。您可以通過使用特性向程序添加聲明性信息。一個聲明性標簽是通過放置在它所應用的元素前面的方括號([ ])來描述的。
特性(Attribute)用于添加元數據,如編譯器指令和注釋、描述、方法、類等其他信息。.Net 框架提供了兩種類型的特性:預定義特性和自定義特性
ActionFilterAttribute實現了兩個很重要的接口:IActionFilter,IResultFilter




ActionFilterAttribute實現了它們,那么自然也擁有這四個方法
首先,IActionFilter接口的 OnActionExecuting方法和OnActionExecuted方法:
? ? ? ? //該方法會在action方法執行之前調用??? ? ? ? public override void OnActionExecuting(ActionExecutingContext filterContext)??? ? ? ? {??? ? ? ? ? ? filterContext.HttpContext.Response.Write("我是OnActionExecuting,我在action方法調用錢執行<br/>");??? ? ? ? ? ? base.OnActionExecuting(filterContext);??? ? ? ? }????? ? ? ? //該方法會在action方法執行之后調用??? ? ? ? public override void OnActionExecuted(ActionExecutedContext filterContext)??? ? ? ? {??? ? ? ? ? ? filterContext.HttpContext.Response.Write("我是OnActionExecuted,我在action方法調用后執行<br/>");??? ? ? ? ? ? base.OnActionExecuted(filterContext);??? ? ? ? }??調用的時候直接這么調用:
[MyFilter]??public void FilterTest()??{??? ? ?Response.Write("我是action方法,在這里執行了</br>");??}要在一個action方法中使用一個過濾器,只要在該方法上貼一個過濾器的標簽就ok了。
?
但是有時候我們會有這樣的一需求:
在過濾器中當遇到了貼了某某標簽的action方法就跳過不進行驗證
這怎么辦呢?
可以通過filterContext的ActionDescriptor屬性類完成這易操作
ActionDescriptor顧名思義,action方法的描述著
在ActionDescriptor中我們可以拿到相應的action方法信息,甚至還可以拿到一個控制器描述著ControllerDescriptor
代碼如下:
? ? ? ? //該方法會在action方法執行之前調用??? ? ? ? public override void OnActionExecuting(ActionExecutingContext filterContext)??? ? ? ? {??? ? ? ? ? ? filterContext.HttpContext.Response.Write("我是OnActionExecuting,我在action方法調用前執行<br/>");??? ? ? ? ? ? //判斷該action方法時候有貼上MyFilter1Attribute標簽??? ? ? ? ? ? if (filterContext.ActionDescriptor.IsDefined(typeof (MyFilter1Attribute),false))??? ? ? ? ? ? {??? ? ? ? ? ? ? ? //如果有,為該action方法直接返回ContentResult,則該action方法在這里就有了返回值,相當于在這里就結束了,不會在去執行之后的方法,如:OnActionExecuted等??? ? ? ? ? ? ? ? filterContext.Result = new ContentResult();??? ? ? ? ? ? }??? ? ? ? ? ? base.OnActionExecuting(filterContext);??? ? ? ? }這樣action方法中和OnActionExecuted中的Response.Write都沒有被執行,也就是說,該action方法被跳過了
?
接下來看看IResultFilter接口的兩個方法:OnResultExecuting方法和OnResultExecuted方法
? ? ? ? //在action方法返回結果之后執行??? ? ? ? public override void OnResultExecuting(ResultExecutingContext filterContext)??? ? ? ? {??? ? ? ? ? ? filterContext.HttpContext.Response.Write("我是OnActionExecuting,我action方法返回結果之前執行<br/>");??? ? ? ? ? ? base.OnResultExecuting(filterContext);??? ? ? ? }????? ? ? ? //在action方法返回結果之前前執行??? ? ? ? public override void OnResultExecuted(ResultExecutedContext filterContext)??? ? ? ? {??? ? ? ? ? ? filterContext.HttpContext.Response.Write("我是OnResultExecuted,我在action方法返回結果之后執行<br/>");??? ? ? ? ? ? base.OnResultExecuted(filterContext);??? ? ? ? }使用方法和IActionFilter的使用方法是一樣的。
IResultFilter接口中的方法和IActionFilter方法的區別就是執行位置不一樣。
?
mvc框架中還有一個過濾器,他就是權限過濾器AuthorizeAttribute
該過濾器在所有action方法過濾器之前執行,也就是說,提供了一個可以超前驗證的方法
我們在添加一個新的過濾器類,并繼承自AuthorizeAttribute
重寫其OnAuthorization方法如下:
【注意,把基類的OnAuthorization方法去掉,因為我們并不需要,而且留著可能會出現一些錯誤異常】
? ? public class MyFilterReAttribute:AuthorizeAttribute??? ? {??? ? ? ? //在所有action方法過濾器之前執行??? ? ? ? public override void OnAuthorization(AuthorizationContext filterContext)??? ? ? ? {??? ? ? ? ? ? filterContext.HttpContext.Response.Write("我是OnAuthorization,在所有action方法過濾器之前執行<br/>");??? ? ? ? ? ? //base.OnAuthorization(filterContext);??? ? ? ? }??? ? }? ? ? ? [MyFilter]??? ? ? ? [MyFilterRe]??? ? ? ? public ActionResult FilterTest()??? ? ? ? {??? ? ? ? ? ? Response.Write("我是action方法的Response.Write,在這里執行了~~</br>");??? ? ? ? ? ? return View();??? ? ? ? }運行之后:


這樣我們就可以根據需要選擇合適的方法進行權限驗證,過濾,攔截等等動作。
如果控制器中的所有action都需要驗證等,那么就可以在控制類中統一貼上標簽:


這樣該控制器中的所有action方法都會進行驗證
那么,如果每個控制器都需要驗證、過濾、攔截呢?
這個時候就需要打開App_Start文件夾,打開FilterConfig類,在這里面添加全局的過濾器:


下面簡單說一下FilterConfig類。
在Global.asax文件中,FilterConfig類是全局Filter的管理器:


FilterConfig類在項目的App_Start文件夾下:




默認已經注冊了一個HandleErrorAttribute類(異常過濾器),我們可以通過GlobalFilterCollection 類對全局過濾器進行管理,比如對全局過濾器進行注冊、刪除和管理運行順序等操作


【備注:所謂的全局過濾器,就是會應用到所有操作方法和控制器的過濾器,一旦在FilterConfig類中注冊了某個過濾器,就不需要再額外去控制器中聲明。】
?---------------------?作者:knqiufan?來源:CSDN?原文:https://blog.csdn.net/knqiufan/article/details/82413885?版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

轉載于:https://www.cnblogs.com/Jeely/p/10953476.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/386722.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386722.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386722.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

elk docker

換了個運行環境,重新搭建一套公司本地內部的ELK,之前也搭過(可訪問:https://yanganlin.com/31.html),最近做什么事情都想用Docker,這次也用Docker,還算順利,沒掉什么坑里,上次搭建,也用用的6.2的版本,這都過了一年,Elk這三個產品,都已經上7了,用docker搭建的還是用6.2.4,穩定不…

LeetCode Largest Number

1231231轉載于:https://www.cnblogs.com/ZHONGZHENHUA/p/10954249.html

有個需求mybatis?插入的時候不知道有哪些字段,需要動態的傳入值和字段

有個需求mybatis 插入的時候不知道有哪些字段&#xff0c;需要動態的傳入值和字段&#xff0c; Java code? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Test public void testAddProductGuaranty() { //1 560 50000 2014/10/2 0:00:00 2014/11/1 0…

readonly的用法

轉載于:https://www.cnblogs.com/w123w/p/10958567.html

mybatis insert 動態生成插入的列及插入的值

代碼如下 &#xff1a; 1.mapper.xml 文件 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper name…

loj2245 [NOI2014]魔法森林 LCT

[NOI2014]魔法森林 鏈接 loj 思路 a排序&#xff0c;b做動態最小生成樹。 把邊拆成點就可以了。 uoj98.也許lct復雜度寫假了、、越卡常&#xff0c;越慢 代碼 #include <bits/stdc.h> #define ls c[x][0] #define rs c[x][1] using namespace std; const int N 2e5 7; …

Jenkins發布spring boot到hub.Docker 方法

在生成的目錄下&#xff0c;建立個文件&#xff0c;文件名稱為&#xff1a;Dockerfile FROM java:8 VOLUME /tmp ADD target/assignment-0.0.1-SNAPSHOT.jar /dalaoyang.jar ENTRYPOINT ["java","-Djava.security.egdfile:/dev/./urandom","-jar&q…

網頁視頻直播、微信視頻直播技術解決方案:EasyNVR與EasyDSS流媒體服務器組合之區分不同場景下的直播接入需求...

背景分析 熟悉EasyNVR產品的朋友們都知道&#xff0c;EasyNVR不僅可以獨成體系&#xff0c;而且還可以跟其他系列產品相配合&#xff0c;形成各種不同類型的解決方案&#xff0c;滿足各種不同應用場景的實際需求。針對很多設備現場沒有固定公網IP&#xff0c;但是又想實現公網、…

如何解決VMware Workstation 10.0.0 build-1295980馬賽克現象

VMware Workstation 10.0.0 build-1295980偶爾出現客戶機馬賽克現象&#xff0c;可切換至其它選項卡&#xff0c;再切換回去即可。 還有一種方式是關閉加速3D圖形。 轉載于:https://www.cnblogs.com/rms365/p/10961499.html

不同賬號間的云資源授權方法

阿里云的訪問控制RAM產品可以實現資源的分配和授權,在一個特殊的業務背景下,資源也可以實現跨賬號的授權使用. 背景: 1.A公司,作為甲方Party A,出資購買云資源,對云資源具有所有權,但不實際管理,需要乙方配合. 2.B公司,作為乙方Party B,要管理A公司的云資源,需要A公司授權云資…

知乎上已獲千贊,全網獨家首發!

前言 選了開發這一行&#xff0c;就意味著想混得好就要持續學習&#xff0c;你的技術和薪資、位置直接掛鉤&#xff0c;進步對于程序員的重要性就不贅述了&#xff0c;接下來作為過來人&#xff0c;為廣大同行分享一些學習干貨&#xff0c;希望可以幫到大家 1、網絡 網絡協議…

知乎上已獲千贊,持續更新中

前言 不知不覺自己已經做了幾年開發了&#xff0c;由記得剛出來工作的時候感覺自己能牛逼&#xff0c;現在回想起來感覺好無知。懂的越多的時候你才會發現懂的越少。 如果你的知識是一個圓&#xff0c;當你的圓越大時&#xff0c;圓外面的世界也就越大。 最近看到很多Androi…

centos下搭建Jenkins持續集成環境(安裝jenkins)

centos下搭建Jenkins持續集成環境(安裝jenkins) 1、安裝JDK yum install -y java 2、安裝jenkins 添加Jenkins庫到yum庫&#xff0c;Jenkins將從這里下載安裝。 1 wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo 2 rpm --import h…

elementUi Dialog 對話框使用中數據獲取問題

Dialog 對話框&#xff1a;使用中數據獲取問題演示代碼&#xff1a; <div class"centerContent"><ul><li class"contentBox" v-for"(notice,index) in systemNotices" :key"index"> //循環取值<div class&quo…

全志_功能引腳配置_sys_config.fex

\lichee\tools\pack\chips\sun8iw5p1\configs\vstar\sys_config.fex;---------------------------------------------------------------------------------------------------------————————; port configuration:; port_name port:GPIO<mux><pull up/down&…

離開小廠進大廠的第一周,BTAJ大廠最新面試題匯集,面試總結

大佬帶你走進Android開發的世界&#xff0c;掌握了這些知識點&#xff0c;學習Android也可以很輕松。 核心分析內容 對于怎么學習Android&#xff0c;主要解決的是3個問題&#xff1a;學什么、怎么學 & 怎么用。 具體如下&#xff1a; 下面&#xff0c;我將帶著上述幾個問…

POI增加 數據驗證 下拉

POI增加驗證列 List<String> nationality new ArrayList<String>();List<String> last_education new ArrayList<String>();List<String> graduated_yotei new ArrayList<String>();List<String> entrance_period new ArrayLis…

同源策略和跨域

同源策略是瀏覽器的一個安全功能&#xff0c;不同源的客戶端腳本在沒有明確授權的情況下&#xff0c;不能讀寫對方資源。所以a.com下的js腳本采用ajax讀取b.com里面的文件數據是會報錯的。 兩個頁面&#xff0c;域名 協議 端口都相同。表示同源 受前面所講的瀏覽器同源策略的影…

程序員35歲真的是分水嶺嗎?小白也能看明白

前言 今天我給大家再次分享一下&#xff0c;我最近的一些讀書的感想&#xff0c;思考起來&#xff0c;確實能夠給自己帶來一些真實的幫助和啟發&#xff0c;希望大家在平時的工作學習中&#xff0c;也能夠認清楚學習的一些本質。 如果我們的學習是在不斷掌握應對具體工作場景…

遠程桌面最新漏洞CVE-2019-0708 POC利用復現

POC有點雞肋&#xff0c;并沒有藍屏&#xff01;&#xff01;&#xff01; POC運行環境&#xff1a; Python 3.5.6 |Anaconda 4.2.0 (64-bit)| (default, Aug 26 2018, 16:05:27) [MSC v.1 900 64 bit (AMD64)] on win32 依賴包及POC下載地址&#xff1a; 鏈接&#xff1a;http…