ASP.NET MVC使用Filter解除Session, Cookie等依賴

jopen 10年前發布 | 74K 次閱讀 ASP.NET .NET開發

本文介紹了Filter在MVC請求的生命周期中的作用和角色,以及Filter的一些常用應用場景。 同時針對MVC中的對于Session,Cookie等的依賴,如何使用Filter解依賴。

如果大家有什么好的Filter應用方法,希望一起多交流。

閱讀目錄:

一、Filter在MVC生命周期中的位置

二、Filter常見的應用場景

三、Filter的執行順序

四、MVC中常見的對于Session, Cookie的依賴

五、使用Filter解除依賴

</blockquote>

1. Filter在MVC生命周期中的位置

下面的圖中, 一個完成的MVC的生命周期分為5個步驟, 對應圖例中的1~5

  • IIS中傳遞請求到程序
  • MVC根據Routing來選擇由哪個Controller/Action來處理
  • Controller調用Model(業務邏輯)來處理數據
  • Controller選擇一個View, 同時把需要呈現的數據交給View Engine呈現
  • 最后,返回最終的Response到客戶端
  • </ul>

    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.

    ASP.NET MVC使用Filter解除Session, Cookie等依賴

    2. Filter常見的應用場景

    下面是個人在開發中,常用到的Filter處理:

    • 權限驗證
    • </ul>

      使用Authorization filters,攔截請求,在進入到Controller處理之前,驗證用戶是否登錄或者登錄用戶是否有權限訪問改頁面。

      如果合法,就繼續交由Controller處理,如果非法,中斷流程,跳轉到登錄頁面。

      • 日志記錄
      • </ul>

        通過Action Filter跟蹤記錄Action處理開始的時間,結束時間,訪問的具體Controller和Action, 參數,訪問者ip等信息。

        • 異常處理
        • </ul>

          異常處理Exception filter能夠在發生異常的時候,記錄異常信息。如果是session過期引起的異常,則跳轉到登錄頁面,如果是程序運行導致的無法處理異常,則跳轉到友好的錯誤頁面。

          • 提升SEO效果
          • </ul>

            每篇博客文章的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);
               }
            

            }</pre>

            改造后的Index Action方法如下:

            [SessionUserParameter]
            public ActionResult Index(UserAccount sessionUser)
            {
                 //send email
                 var email = sessionUser.Email;
                 …………
            }

            這樣Index方法就解除了對于Session的依賴, 而只是依賴于一個普通的實體類UserAccount.

            在單元測試中,只需要簡單的構造一個UserAccount的對象就可以了。

            來自: JustRun

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!