最近悟出來一個道理,在這兒分享給大家:學歷代表你的過去,能力代表你的現在,學習代表你的將來。
十年河東十年河西,莫欺少年窮
學無止境,精益求精
最近在做自學MVC,遇到的問題很多,索性一點點總結下。
寫過webForm項目的童鞋都知道,在執行Page_Load()之前,會執行:OnInit(EventArgs e),那麼在MVC中,在執行Action方法之前,會執行什麼呢?在執行MVC Action之後,又會執行什麼呢?下面給出答案:
1、OnActionExecuting 在執行操作方法之前由 MVC 框架調用。
2、OnActionExecuted 在執行操作方法後由 MVC 框架調用。
3、OnResultExecuting 在執行操作結果之前由 MVC 框架調用。
4、OnResultExecuted 在執行操作結果後由 MVC 框架調用。
根據上述,我們可以看出,在執行Action方法之前,MVC會執行OnActionExecuting()方法,這個方法在控制器中並沒有展示給我們,需要我們進行重寫。
下面以程序為例進行說明:
namespace WeiXinApi.Controllers { //統一授權驗證 [Authorize(Roles = "admins")] public class MangerController : Controller { public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext) { if (true) { //執行相關操作 //................一般執行如下操作................ //讀取用戶登錄信息,獲取用戶權限 //MVC Form驗證是通過Cookies實現的,因此在此處讀取Cookies 並作驗證 } else { //如果驗證失敗,則返回登陸頁 filterContext.HttpContext.Response.Redirect("/Home/Login"); } } public MangerController() { ViewBag.NewsCount = 43; } public ActionResult index() { return View(); } public ActionResult wei_Configs() { return View(); } } }
那麼,按照上述的思路,如果你有多個Controller需要驗證,那麼就必須在每個Controller中重寫這個方法,顯然這樣做是比較笨的方法,那麼我們動動我們聰明的小腦袋,很快會想出一個方法:那就是繼承。
我們寫一個父親控制器,在這個父親控制器中,我們重寫這個方法,然後在需子控制器中繼承父親控制器即可,代碼如下:
看到這兒,相信做過webForm的童鞋就會想起basePage.cs中的如下代碼:
那麼,這樣定義一個父親控制器就算完美了嗎?如果有個控制器需要繼續另外一個類怎麼辦?
由於其已經繼承了父親控制器,那麼子控制器就不能再繼承其他類,這樣顯然降低了程序的可擴展性,我們應當怎麼辦呢?
還好,MVC為我們提供了過濾器,ActionFilterAttribute裡也有OnActionExecuting方法,跟Controller中的OnActionExecuting方法一樣, 同是抽象實現了IActionFilter接口。
我們新建派生類如下:
namespace WeiXinApi.App_Start { public class AuthenticationAttribute : ActionFilterAttribute { public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext) { string cookieName = FormsAuthentication.FormsCookieName;//讀取登錄授權Cookies的名稱 HttpCookie authCookie = System.Web.HttpContext.Current.Request.Cookies[cookieName];//接收這個Cookies FormsAuthenticationTicket authTicket = null; try { authTicket = FormsAuthentication.Decrypt(authCookie.Value);//我們知道MVC登錄授權的Cookies是加密的,所以我們在此需要解密 } catch (Exception ex) { return; } if (authTicket != null && filterContext.HttpContext.User.Identity.IsAuthenticated)//如果Cookies不為Null 也通過驗證 { string UserName = authTicket.Name; CommonMethod.setCookieForMIn("UserName", UserName, 30);//用於全局,加載用戶信息 base.OnActionExecuting(filterContext); } else { filterContext.HttpContext.Response.Redirect("/Home/Login");//否則跳轉至登陸頁 } } } }
至於MVC登錄授權的方法,大家可以參考我的博客:MVC 登錄認證與授權及讀取登錄錯誤碼
在此,我們深究下ActionFilterAttribute 類的說明:
在此:問大家一個問題,何為:Attribute ?
中文名稱解釋為特性、屬性
MVC的數據注解與驗證中會用到好多特性,譬如:
那麼,我們應當怎麼使用新建的 AuthenticationAttribute 類呢?
根據需求,大家可在類范圍內使用這個特性,亦可在Action方法頭上使用這個特性。
以上便是MVC自定義過濾器特性來驗證授權登錄信息的方法
祝大家有個好心情,謝謝
@陳臥龍的博客