filter執行先後問題 Filter執行順序

2021-10-13 04:16:14 字數 2653 閱讀 7284

asp.net mvc framework支援四種不同型別的filter:

authorization filters – 實現iauthorizationfilter介面的屬性.

action filters – 實現iactionfilter介面的屬性.

result filters – 實現iresultfilter介面的屬性.

exception filters – 實現iexceptionfilter介面的屬性.

filter的預設的執行順序按上面的列表中順序進行。如驗證(authorization)filter永遠都是最開始執行的,異常(exception)filter永遠都是最後執行的,當然你也可以根據需要通過order屬性設定過濾器執行的順序。

asp.net mvc framework包括幾種action filter:

名稱說明

outputcacheattribute

類似於 web form中在 outputcache 指令。 outputcache 屬性允許在 mvc framework 快取控制器的輸出。

validateinputattribute

類似於 web form中 validaterequest 屬性。 mvc 框架預設將為 檢查html 或其他危險輸入傳入的 http 請求。 如果檢測到,將引發異常。 使用此屬性可以禁用請求驗證。

authorizeattribute

authorize 屬性,可以對控制器操做的宣告性的授權檢查。 該屬性可以限制特定角色中的使用者的操作。 當您建立只應該給管理員角色中的使用者的操作時,您可以使用此屬性。預設使用的asp.net membership服務,如果不使用asp.net 的membership服務,可以繼承authorizeattribute,重寫實現。

validateantiforgerytokenattribute

此屬性是乙個解決方案以幫助防止跨站點的請求攻擊 (csrf)。 它允許驗證的 http post 為特定於使用者的標記在 framework。 有關詳細資訊 csrfs,請參閱" 使用 asp.net mvc antiforgerytoken() 幫助器防止跨站點請求偽造 (csfr)."

驗證(authorization)filter用於實現在controller action上的驗證和授權,如authorize filter就是乙個驗證filter的例子;

action filter包含一些邏輯,用於該action執行之前或者之後。比如可以使用乙個action filter來修改action返回的view data;

result filter包含一些邏輯,用於該action的view result執行之前和之後。比如可以修改乙個view result在view被呈現到瀏覽器之前;

異常(exception)action用於處理異常資訊,同樣可以使用異常filter記錄錯誤日誌。

這些的filter型別是根據指定的順序執行的,如果需要控制他們的執行順序,需要設定filter的order屬性。

這些類的基類為system.web.mvc.filterattribute類,如果需要實現乙個特定的filter型別,可以建立乙個繼承這個類的類,並且實現乙個或多個iauthorization、iactionfilter、iresultfilter、exceptionfilter介面。

action過濾器的作用範圍

除了用action過濾器標記乙個action方法外,你也可以用來標記乙個完成的控制器類。如果這樣的話,這個action過濾器將會應用到該控制器的所有action方法上。

另外,如果你的控制器類繼承自別的控制器類,而基控制器類可能有它自己的action過濾器attributes。如果你在子類中重寫了基控制器類的action方法,則子類的該action方法也會有它自己的從基類繼承而來的action過濾器attributes。

action過濾器的執行順序

每乙個action過濾器都有乙個 order 屬性,用來決定action過濾器在該範圍內的執行順序。order屬性必需是0(預設值)或者更大的整數值。省略order屬性則會給該過濾器的order值為 -1, 表明為指明順序。任何乙個在同一範圍的action過濾器order設為 -1 的都將按不確定的順序執行,單在此之前過濾器有乙個特定的順序(注:下面會說到).

當設定order屬性的值的時候,必需指定乙個唯一的值。如果兩個或者更多的action過濾器具有相同的order屬性值,將會丟擲乙個異常。

來看乙個示例:

[logincheckattribute(order=1)]

[userauthorizeattribute(order=2)]public classbasecontroller : controller

[filter1(order = 2)]

[filter2(order= 3)]

[filter3(order= 1)]public voidindex()

renderview("index");

filter的執行順序為:filter3 => filter1 => filter2.

內建過濾器簡介

1 outputcacheattribute

[outputcache(duration=10,varybyparam="none")]publicactionresult testcache() {

viewbag.time=datetime.now.tostring();returnview();

try finally執行先後?

有這樣的一段 public static void main string args private static int test finally 輸出結果 x 2 t 1 從結果來看,肯定是執行了,也不可能先於try執行,大多數人覺得是後於try執行,也有說是return執行中的時候執行。但是看...

php執行先後順序 php執行順序問題

後台 統計有多少結果 record tmp doctor news class get disease info count asc record total record tmp 0 c 每頁顯示條數 record per page 20 分頁 pag.後台 統計有多少結果 record tmp ...

transform 多值先後執行順序

一 用例 1.先平移後旋轉 box keyframes move100 div class box 1231212212 div 效果圖 1231212212 2.先旋轉後平移 因為rotate旋轉的時候會旋轉座標軸,之後再進行translate會依據新的座標軸。所以會導致向下平移了200px bo...