ASP.NET MVC使用Filter解除Session, Cookie等依賴
本文介紹了Filter在MVC請求的生命週期中的作用和角色,以及Filter的一些常用應用場景。 同時針對MVC中的對於Session,Cookie等的依賴,如何使用Filter解依賴。
如果大家有什麼好的Filter應用方法,希望一起多交流。
閱讀目錄:
一、Filter在MVC生命週期中的位置
二、Filter常見的應用場景
三、Filter的執行順序
四、MVC中常見的對於Session, Cookie的依賴
五、使用Filter解除依賴
1. Filter在MVC生命週期中的位置
下面的圖中, 一個完成的MVC的生命週期分為5個步驟, 對應圖例中的1~5
- IIS中傳遞請求到程式
- MVC根據Routing來選擇由哪個Controller/Action來處理
- Controller呼叫Model(業務邏輯)來處理資料
- Controller選擇一個View, 同時把需要呈現的資料交給View Engine呈現
- 最後,返回最終的Response到客戶端
Filter在MVC的生命週期中的角色就像是一個一個的截面,在MVC的處理過程中,攔截請求。
Filter分為:
Authorization filters – 需要實現IAuthorizationFilter介面,用於驗證處理驗證相關的操作
Action filters –需要實現IActionFilter介面. 在Action處理的開始和結束做攔截操作
Result filters – 需要實現IResultFilter介面. 在View呈現前和呈現後做處理
Exception filters – 需要實現IExceptionFilter介面,只要是新增了Exception Filter的請求中出現異常,都會被攔截
每個Filter的作用時機,對應於下圖中的2a, 2b, 4a, 4b.
2. Filter常見的應用場景
下面是個人在開發中,常用到的Filter處理:
- 許可權驗證
使用Authorization filters,攔截請求,在進入到Controller處理之前,驗證使用者是否登入或者登入使用者是否有許可權訪問改頁面。
如果合法,就繼續交由Controller處理,如果非法,中斷流程,跳轉到登入頁面。
- 日誌記錄
通過Action Filter跟蹤記錄Action處理開始的時間,結束時間,訪問的具體Controller和Action, 引數,訪問者ip等資訊。
- 異常處理
異常處理Exception filter能夠在發生異常的時候,記錄異常資訊。如果是session過期引起的異常,則跳轉到登入頁面,如果是程式執行導致的無法處理異常,則跳轉到友好的錯誤頁面。
- 提升SEO效果
每篇部落格文章的meta資訊能夠幫助提高SEO效果,但是很多人對於填寫keyword, description等資訊覺得太繁瑣。
可以使用Result filters,在最後呈現頁面前,使用程式分析內容,提取keyword和description來,然後填充到meta資訊中。
這樣,每篇部落格文章都能夠有程式實現最佳的SEO效果,甚至生成一份SEO報告出來。
3. Filter的執行順序
Filter之間執行的順序,首先根據型別區分:
分別是Authorization filters, Action filters, Result filters. Exception Filter沒有列入的原因是, 它是在發生異常的時候處理,沒有特定的順序。
當同時一個型別的Filter的時候,執行順序可以通過Filter的Order屬性來排序。
4. MVC中常見的對於Session, Cookie的依賴
在Web程式中,對於Session和Cookie等的使用是必不可少的。
比如, 很多的Action的程式碼中,會要從Session中獲取當前登入使用者資訊:
public ActionResult Index() { var user = Session[“UserAccuont”];//從Session中獲取當前登入使用者的資訊 //send email var email = user.Email; ………… }
上面的Index方法的問題就是和Session耦合,很難單元測試。
下面介紹如何使用Filter來解除對於Session的依賴。
5. 使用Filter解除依賴
新增一個SessionUserParameterAttribute的Action Filter, 它的功能是:
從Session中取得User, 將取得的User賦值給Action中的引數sessionUser.
public class SessionUserParameterAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { const string key = "sessionUser"; if (filterContext.ActionParameters.ContainsKey(key)) { filterContext.ActionParameters[key] = Session[“UserAccuont”];//為Action設定引數 } base.OnActionExecuting(filterContext); } }
改造後的Index Action方法如下:
[SessionUserParameter] public ActionResult Index(UserAccount sessionUser) { //send email var email = sessionUser.Email; ………… }
這樣Index方法就解除了對於Session的依賴, 而只是依賴於一個普通的實體類UserAccount.
在單元測試中,只需要簡單的構造一個UserAccount的物件就可以了。
相關文章
- Asp.Net Mvc使用Autofac實現依賴注入ASP.NETMVC依賴注入
- 為什麼說session依賴cookie,以及cookie的常用知識SessionCookie
- servlet,filter,sessionListener,cookie,session操作ServletFilterSessionCookie
- ASP.NET MVC FilterASP.NETMVCFilter
- Asp.Net Mvc3.0(MEF依賴注入理論)ASP.NETMVC依賴注入
- [ASP.NET MVC 小牛之路]04 - 依賴注入(DI)和NinjectASP.NETMVC依賴注入
- [ASP.NET MVC 小牛之路]11 - FilterASP.NETMVCFilter
- ASP.NET Core中的依賴注入(2):依賴注入(DI)ASP.NET依賴注入
- Asp.Net MVC 中的 Cookie(譯)ASP.NETMVCCookie
- ASP.NET MVC下使用AngularJs語言(七):Cookie的使用ASP.NETMVCAngularJSCookie
- ASP.NET Core依賴注入(DI)ASP.NET依賴注入
- ASP.NET Core 依賴注入(DI)ASP.NET依賴注入
- ASP.NET Core - 依賴注入(二)ASP.NET依賴注入
- ASP.NET Core - 依賴注入(一)ASP.NET依賴注入
- ASP.NET Core - 依賴注入(三)ASP.NET依賴注入
- ASP.NET Core - 依賴注入(四)ASP.NET依賴注入
- 使用Filter跟蹤ASP.NET MVC頁面載入時間FilterASP.NETMVC
- ASP.NET的快取依賴機制-SQL快取依賴篇ASP.NET快取SQL
- maven中的傳遞依賴和傳遞依賴的解除Maven
- Asp.Net MVC 系列--進階篇之FilterASP.NETMVCFilter
- 物件導向~如何解除具體依賴物件
- cookie與session的使用CookieSession
- ASP.NET Core 依賴注入基本用法ASP.NET依賴注入
- [譯]ASP.NET Core 2.0 依賴注入ASP.NET依賴注入
- ASP.NET Core 中介軟體的使用(二):依賴注入的使用ASP.NET依賴注入
- ASP.NET Web API實踐系列02,在MVC4下的一個例項, 包含EF Code First,依賴注入, Bootstrap等ASP.NETWebAPIMVC依賴注入boot
- webapi - 使用依賴注入WebAPI依賴注入
- ASP.NET Core 依賴注入中的ScopeASP.NET依賴注入
- 使用IDEA模組之間依賴找不到依賴類Idea
- .net 溫故知新【13】:Asp.Net Core WebAPI 使用依賴注入DIASP.NETWebAPI依賴注入
- cookie & sessionCookieSession
- cookie sessionCookieSession
- ASP.NET Core依賴注入初識與思考ASP.NET依賴注入
- ASP.NET常見物件之Cookie、Session與ApplicationASP.NET物件CookieSessionAPP
- Asp.Net MVC 使用 AjaxASP.NETMVC
- Laravel 使用依賴注入呼叫方法Laravel依賴注入
- 使用Mockito修改Bean的依賴MockitoBean
- 使用ReflectionTestUtils解決依賴注入依賴注入